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