退出上下文对于WaitHandle.WaitOne意味着什么?

时间:2011-10-19 16:15:32

标签: .net mutex waithandle

我正在尝试使用互斥锁来保护从多个线程访问某些硬件,但我对exitContext参数的含义/做法感到困惑:

public virtual bool WaitOne (
    int millisecondsTimeout,
    bool exitContext
)

The docs说:

  

exitContext - true 在等待之前(如果在同步的上下文中)退出上下文的同步域,并在之后重新获取它;否则, false

...但是这实际意味着什么,将它设置为真或假的后果是什么?我现在已经把它设置为真,代码似乎有用了,但是我很紧张,我不完全明白它是由什么引起的!

2 个答案:

答案 0 :(得分:14)

MSDN页面的备注部分当然就像完全gobbledegook。执行上下文是.NET中隐藏得很好的实现细节。我只会告诉你我的反转设计是什么而不能完全钉住它。

exitContext 参数仅与远程处理方案相关。通过传递 true ,您可以暂停当前呼叫,并将另一个呼叫从客户端封送到服务器。您这样做是为了提高吞吐量,只有在您希望WaitOne()调用需要一段时间时才选择true。然而,这样做的确切含义对我来说并不明显,也无法在我知道的任何地方记录。 WaitOne()重载(没有超时)总是传递 false ,不幸的是,这给我的解释带来了一些压力。

这种方法背后的一个侧面是,人们很难理解微软决定在.NET 2中破坏向后兼容性。他们在Service Pack 2中添加了WaitOne(int)重载。它为传递了false exitContext 参数。这引起了很多混乱,程序员开始使用它然后发现他们的程序在SP2之前版本的.NET上运行时失败。哎哟。

答案 1 :(得分:5)

它还解释了further down the page under Remarks

  

退出上下文的注意事项

     

除非WaitOne方法是,否则exitContext参数无效   从非默认托管上下文中调用。如果这可能发生   你的线程在调用派生自的类的实例内部   ContextBoundObject。即使您当前正在执行某个方法   不是从ContextBoundObject派生的类,比如String,你   如果ContextBoundObject在您的上面,则可以在非默认上下文中   当前应用程序域中的堆栈。

     

当您的代码在非默认上下文中执行时,指定true   对于exitContext,导致线程退出非默认托管   上下文(即转换到默认上下文)之前   执行WaitOne方法。线程返回原始状态   调用WaitOne方法后的非默认上下文完成。

     

当上下文绑定类具有时,这可能很有用   SynchronizationAttribute。在这种情况下,所有呼叫成员   类是自动同步的,以及同步域   是该类的整个代码体。如果调用堆栈中的代码   成员调用WaitOne方法并为exitContext指定true,   线程退出同步域,允许一个线程   在调用该对象的任何成员时阻止继续。当。。。的时候   WaitOne方法返回,进行调用的线程必须等待   重新进入同步域。