Monitor.Wait和“exitContext”参数

时间:2010-12-11 01:25:09

标签: c# .net multithreading synchronization

MSDN文档说明了“exitContext”布尔参数:

  

如果退出并重新获取,则为true   上下文的同步域   (如果在同步上下文中)之前   这段等待;否则,错误。

我不跟随。假设我已经理解脉冲并等待,那么任何人都可以给出这个参数的手持解释吗? 实用使用它的例子非常有价值。

2 个答案:

答案 0 :(得分:5)

.net框架中的一个非常古老的疣;只是传递虚假并继续前进。

他们所指的“上下文”是一个远程上下文。您可以通过在MSDN中查找ContextBoundObject来尝试运行该概念;这将引导你到各种有趣的东西。在CLR设计的某一点上,这些“对象背景”将比实际结束时更重要;许多人忘记了他们首先存在,并且大多数人遇到的与CBO有关的唯一API是Monitor.Wait。

所以只是传入虚假并继续前进。 :)

如果你想要我们可以更深入......

有一种概念是将这些对象上下文中的一个配置为“同步”。事实证明,在CLR中,每个线程都有一个与之关联的逻辑调用上下文。当您使用远程处理进行方法调用时,此逻辑调用上下文将与调用一起传递,以便远程处理边界另一侧的CLR可以将处理请求的线程视为逻辑上相同的线程。如果被调用的对象(远程边界另一侧的对象)回调到原始对象,则该第二次调用可能位于不同的物理线程上。但是,由于逻辑调用上下文与远程调用一起流动,因此第二个物理线程可以重新进入“同步”上下文。

这样做的一个例子很复杂,试图写出来。我可以根据需要为你写一个,但是......

.net框架中的一个非常古老的疣;只是传递虚假并继续前进。 :)

答案 1 :(得分:3)

它与远程处理方案相关,传递true允许传递另一个调用。这个完全相同的参数也是将WaitHandle.WaitOne(int)重载添加到.NET 2.0 SP1的原因。兼容性破坏变化导致了大​​量痛苦。以前只有WaitOne(int,bool)重载可用,没有人知道 exitContext 参数意味着什么。

传递 false 是正常用法。我认为自己对任何使用 true 可能有意义或达到良好目的的实际例子都非常无知。远程处理的核心是相当复杂和文档记录不足。 WCF无关紧要。