【问题标题】:When does WaitOne execute non-framework code?WaitOne 什么时候执行非框架代码?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    相关资源
    最近更新 更多