WaitOne何时执行非框架代码?

时间:2018-09-13 15:19:09

标签: c# multithreading wcf

我遇到了竞争条件,导致正在运行线程System.Threading.WaitHandle.WaitOne的{​​{1}}调用期间执行其他代码。从其文档中,我假设WaitOne会阻塞任何非框架代码的线程,直到满足其返回条件之一为止。

在什么情况下,WaitOne应该在返回之前执行非框架代码?


遗憾的是,我无法确定在我的情况下使用哪种方法来调度实际执行的代码。但是,我仍然可以提供一些细节:

  • 我的控件(Outlook)外部的应用程序加载了一个非托管DLL,该托管DLL调用了托管DLL,后者又调用了WCF代理上的方法。 WCF的实现调用WaitOne,在此期间发生问题。这意味着堆栈上有几个非托管/托管过渡。
  • WCF连接通过WaitOne,目标进程先前已从托管DLL启动。
  • 在WCF代理调用期间,Outlook有机会在同一线程上执行代码。执行完该代码后,调用仍然可以正确完成。
  • 我只在主/ ui线程上观察到了这种行为
  • 我仅在32位版本中观察到了这种行为。 64位版本可以正常工作。
  • 将所有WCF调用移到另一个线程,并切换到NetNamedPipeBinding的显式调用(在通过Task.Wait创建的任务上)时,Task.Run表现出相同的行为;因此,Wait和其他相关方法可能会表现相同。

1 个答案:

答案 0 :(得分:0)

  

.NET中的所有等待都是“可更改的”。这意味着如果等待阻塞,Windows可以在等待的堆栈顶部运行“异步过程调用”。

     

Nicholas Butler,摘自an answer to a different question在评论中由Timmy_A链接的