WaitOne何时执行非框架代码?

问题描述 投票:0回答:1

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

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


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

  • 我的控件之外的应用程序(Outlook)加载一个非托管DLL,它调用托管DLL,该DLL调用WCF代理上的方法。 WCF的实现调用WaitOne,在此期间调用问题。这意味着堆栈上有几个非托管/托管转换。
  • WCF连接通过NetNamedPipeBinding,目标进程先前已从托管DLL启动。
  • 在WCF代理调用期间,Outlook有机会在同一个线程上执行代码。在执行代码之后,调用仍然正确完成。
  • 我只在main / ui线程上观察到这种行为
  • 我只在32位版本中观察到这种行为。 64位版本按预期工作。
  • 当将所有WCF调用移动到不同的线程,并切换到Task.Wait的显式调用时(在通过Task.Run创建的任务上),Wait呈现相同的行为;因此,Monitor.Wait和其他相关方法可能以相同的方式表现。
c# multithreading wcf
1个回答
0
投票

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

- Nicholas Butleran answer to a different question的摘录由Timmy_A在评论中链接

© www.soinside.com 2019 - 2024. All rights reserved.