直到文档 of .NET 4.5,如果我在信号量类的某个对象(通常是WaitHandle类)上使用WaitOne(Int32)方法,其参数为0(0),则它不阻塞,可用于测试信号量的当前状态:
“如果millisecondsTimeout为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回。”
对我来说,这非常令人困惑(甚至误导),因为它不阻塞,但它会减少一个信号量计数。所以如果我像这样使用它:
If (!mySemaphore.WaitOne(0)) DoSomething();然后,它可能会减少我的信号量(如果为真),导致其他线程无法运行。因此,我们不能像这样使用它来测试信号量的状态。正确的使用应该是
If (!mySemaphore.WaitOne(0)) DoSomething();
Else mySemaphore.Release();所以它不仅测试信号量的状态!我说的对吗?
发布于 2014-11-04 15:40:06
正确,它不仅测试信号量状态,更好的措辞是
如果millisecondsTimeout为零,则该方法不会阻塞。该方法尝试接受等待句柄,并在该尝试成功或失败时立即返回。
另外,您的示例是不正确的,正确的使用方法应该是
if (mySemaphore.WaitOne(0))
{
try
{
DoSomething();
}
finally
{
//Only call release when WaitOne returns true, also put it in a finally
//block to make sure it always gets called.
mySemaphore.Release();
}
}
else
{
//Do something else because the resource was not available.
}只有当mySemaphore.Release()返回true时,才应该调用mySemaphore.WaitOne,在当前示例中,只有当它返回false时才调用它。
https://stackoverflow.com/questions/26738972
复制相似问题