Jon*_*age 12 .net mutex waithandle
我正在尝试使用互斥锁来保护从多个线程访问某些硬件,但我对exitContext参数的含义/ 做法感到困惑:
public virtual bool WaitOne (
int millisecondsTimeout,
bool exitContext
)
Run Code Online (Sandbox Code Playgroud)
文档说:
exitContext - 如果在等待之前退出上下文的同步域(如果在同步上下文中),则返回true,然后重新获取它; 否则,错误.
......但这究竟意味着什么,将它设置为真或假的后果是什么?我现在已经把它设置为真,代码似乎有效,但我很紧张,我不完全明白它是什么由引擎盖引起的!
Han*_*ant 14
MSDN页面的备注部分当然就像完全gobbledegook.执行上下文是.NET中隐藏得很好的实现细节.我只是告诉你我的逆转设计而不能完全钉住它.
该exitContext参数仅在远程方案有关.通过传递true,您可以暂停当前调用,并将另一个调用从客户端封送到服务器.您这样做是为了提高吞吐量,只有在您希望WaitOne()调用需要一段时间时才选择true.然而,这样做的确切含义对我来说并不明显,也无法在我知道的任何地方记录.WaitOne()重载(没有超时)总是传递false,遗憾的是,这给我的解释带来了一些压力.
这种方法背后的一个侧面是它很难理解微软决定在.NET 2中破坏向后兼容性.他们在Service Pack 2中添加了WaitOne(int)重载.它为exitContext参数传递了false .这引起了很多混乱,程序员开始使用它然后发现他们的程序在SP2之前版本的.NET上运行时失败.哎哟.
它还在备注下面进一步解释:
退出语境的注意事项
除非从非默认托管上下文中调用WaitOne方法,否则exitContext参数无效.如果您的线程在调用从ContextBoundObject派生的类的实例内部,则会发生这种情况.即使您当前正在对不派生自ContextBoundObject的类(如String)执行方法,如果ContextBoundObject位于当前应用程序域中的堆栈上,您也可以处于非默认上下文中.
当您的代码在非默认上下文中执行时,为exitContext指定true会导致线程在执行WaitOne方法之前退出非默认托管上下文(即,转换到默认上下文).在调用WaitOne方法完成后,线程返回到原始的非默认上下文.
当上下文绑定类具有SynchronizationAttribute时,这可能很有用.在这种情况下,对类成员的所有调用都会自动同步,同步域是该类的整个代码体.如果成员的调用堆栈中的代码调用WaitOne方法并为exitContext指定true,则该线程退出同步域,从而允许在调用该对象的任何成员时阻塞的线程继续.当WaitOne方法返回时,进行调用的线程必须等待重新进入同步域.