我正在尝试使用互斥锁来保护从多个线程访问某些硬件,但我对exitContext
参数的含义/做法感到困惑:
public virtual bool WaitOne (
int millisecondsTimeout,
bool exitContext
)
The docs说:
exitContext - true 在等待之前(如果在同步的上下文中)退出上下文的同步域,并在之后重新获取它;否则, false 。
...但是这实际意味着什么,将它设置为真或假的后果是什么?我现在已经把它设置为真,代码似乎有用了,但是我很紧张,我不完全明白它是由什么引起的!
答案 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方法返回,进行调用的线程必须等待 重新进入同步域。