Я испытываю состояние гонки, ведущее к выполнению другого кода во время вызова System.Threading.WaitHandle.WaitOne в потоке, в котором работает WaitOne. Из его документации я предположил, что WaitOne блокирует поток для любого кода, не являющегося фреймворком, до тех пор, пока не будет выполнено одно из его условий возврата.
В каких ситуациях, если таковые имеются, WaitOne должен выполнять код вне фреймворка перед возвратом?
К сожалению, я не могу определить, какой метод был использован для планирования кода, который действительно выполняется в моем случае. Тем не менее, я все же могу привести некоторые подробности:
WaitOne, во время которого возникает проблема. Это означает, что в стеке есть несколько неуправляемых / управляемых переходов.NetNamedPipeBinding, целевой процесс ранее был запущен из управляемой библиотеки DLL.Task.Wait (в задачах, созданных с помощью Task.Run), Wait ведет себя так же; таким образом, вероятно, что Monitor.Wait и другие родственные методы ведут себя одинаково.@Timmy_A: спасибо за ссылку! Определенно горячий кандидат, хотя я (пока) не понимаю, почему эти вызовы происходят только на 32-битной версии.
@Timmy_A: похоже, что APC действительно являются причиной. Не стесняйтесь добавить подходящую цитату к своему комментарию и повторно опубликовать его в качестве ответа. Затем я удалю свой ответ, состоящий только из цитаты, и приму ваш.





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
Наверное, вот вам ответ. stackoverflow.com/questions/8431221/…