Monitor.Wait和"exitContext"参数

7

MSDN文档中对于"exitContext"布尔参数的说明如下:

true表示在等待之前退出并重新获取上下文的同步域(如果在同步上下文中);否则为false。

我不明白。假设我已经了解了pulse和wait,有人能给这个参数提供一个手把手的解释吗?一个实际使用它的例子将非常有价值。

2个回答

7

这是.net框架中的一个非常古老的问题; 只需传递false并继续。

他们所指的“上下文”是远程上下文。您可以通过在MSDN中查找ContextBoundObject来了解此概念;这将引导您了解各种有趣的内容。在CLR设计的某个时候,这些“对象上下文”将比它们实际上变得更加重要;许多人甚至忘记它们首先存在,大多数人遇到与CBO相关的唯一API是Monitor.Wait。

所以只需传递false并继续。 :)

如果您想深入了解,我们甚至可以更深入...

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

这里写一个示例太复杂了。我可以根据需要为您编写一个,但是...

这是.net框架中的一个非常古老的问题; 只需传递false并继续。 :)


3

在远程调用场景中,这是相关的。传递true允许另一个调用被传递。正是因为这个原因,WaitHandle.WaitOne(int)重载被添加到.NET 2.0 SP1中。这是一种破坏兼容性的变化,给人们带来了很多痛苦。之前只提供了WaitOne(int, bool)重载,而且没有人知道那个exitContext参数的含义。

传递false是正常使用方式。我认为自己对使用true的任何实际示例都不了解,无论是有意义还是有好的结果。远程调用本质上非常复杂且文档不完善。WCF使其不再相关。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接