【发布时间】:2019-02-18 08:59:28
【问题描述】:
在调用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和其他相关方法的行为方式可能相同。
【问题讨论】:
-
可能这就是你的答案。 stackoverflow.com/questions/8431221/…
-
@Timmy_A:感谢您的链接!绝对是热门候选人,虽然我(还)不明白为什么这些调用只发生在 32 位上。
-
@Timmy_A:似乎 APC 确实是原因。随意在您的评论中添加合适的报价并将其重新发布为答案,然后我将删除我的仅报价答案并接受您的。
标签: c# multithreading wcf