Когда WaitOne выполняет код вне фреймворка?

Я испытываю состояние гонки, ведущее к выполнению другого кода во время вызова System.Threading.WaitHandle.WaitOne в потоке, в котором работает WaitOne. Из его документации я предположил, что WaitOne блокирует поток для любого кода, не являющегося фреймворком, до тех пор, пока не будет выполнено одно из его условий возврата.

В каких ситуациях, если таковые имеются, WaitOne должен выполнять код вне фреймворка перед возвратом?


К сожалению, я не могу определить, какой метод был использован для планирования кода, который действительно выполняется в моем случае. Тем не менее, я все же могу привести некоторые подробности:

  • Приложение вне моего контроля (Outlook) загружает неуправляемую DLL, которая вызывает управляемую DLL, которая вызывает метод на прокси-сервере WCF. Реализация WCF вызывает WaitOne, во время которого возникает проблема. Это означает, что в стеке есть несколько неуправляемых / управляемых переходов.
  • Соединение WCF проходит через NetNamedPipeBinding, целевой процесс ранее был запущен из управляемой библиотеки DLL.
  • Во время вызова прокси-сервера WCF Outlook получает возможность выполнить код в том же потоке. После выполнения этого кода вызов по-прежнему завершается правильно.
  • Я наблюдал такое поведение только в потоке main / ui
  • Я наблюдал такое поведение только в 32-битных сборках. 64-битные сборки работают должным образом.
  • При перемещении всех вызовов WCF в другой поток и переключении на явные вызовы Task.Wait (в задачах, созданных с помощью Task.Run), Wait ведет себя так же; таким образом, вероятно, что Monitor.Wait и другие родственные методы ведут себя одинаково.

Наверное, вот вам ответ. stackoverflow.com/questions/8431221/…

Timmy_A 13.09.2018 21:25

@Timmy_A: спасибо за ссылку! Определенно горячий кандидат, хотя я (пока) не понимаю, почему эти вызовы происходят только на 32-битной версии.

dst 13.09.2018 21:42

@Timmy_A: похоже, что APC действительно являются причиной. Не стесняйтесь добавить подходящую цитату к своему комментарию и повторно опубликовать его в качестве ответа. Затем я удалю свой ответ, состоящий только из цитаты, и приму ваш.

dst 14.09.2018 06:55
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

All waits in .NET are "alertable." This means that if a wait blocks, Windows can run "Asynchronous Procedure Calls" on top of the waiting stack.

Nicholas Butler, excerpt from an answer to a different question linked by Timmy_A in the comments

Другие вопросы по теме