我遇到竞争条件导致在调用System.Threading.WaitHandle.WaitOne
期间执行的其他代码,在WaitOne
正在运行的线程上。从它的文档中,我假设WaitOne
阻塞任何非框架代码的线程,直到满足其返回条件之一。
在什么情况下,如果有的话,WaitOne
应该在返回之前执行非框架代码?
遗憾的是,我无法确定用于调度在我的情况下实际执行的代码的方法。但是,我仍然可以提供一些细节:
WaitOne
,在此期间调用问题。这意味着堆栈上有几个非托管/托管转换。NetNamedPipeBinding
,目标进程先前已从托管DLL启动。Task.Wait
的显式调用时(在通过Task.Run
创建的任务上),Wait
呈现相同的行为;因此,Monitor.Wait
和其他相关方法可能以相同的方式表现。.NET中的所有等待都是“可警告的”。这意味着如果等待块,Windows可以在等待堆栈的顶部运行“异步过程调用”。
- Nicholas Butler,an answer to a different question的摘录由Timmy_A在评论中链接