C# .NET 4.5信号量WaitOne(0)不阻塞,但会减少信号量计数
在.NET 4.5版本之前,如果我在信号量类或-通常-WaitHandle类的某个对象上使用WaitOneInt32方法(参数为0 0),它不会阻塞,并且可能用于测试信号量的当前状态: 如果毫秒刺激为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回 对我来说,这是非常令人困惑甚至误导的,因为它不会阻塞,但它会将信号量计数减少1。因此,如果我这样使用它:C# .NET 4.5信号量WaitOne(0)不阻塞,但会减少信号量计数,c#,.net,C#,.net,在.NET 4.5版本之前,如果我在信号量类或-通常-WaitHandle类的某个对象上使用WaitOneInt32方法(参数为0 0),它不会阻塞,并且可能用于测试信号量的当前状态: 如果毫秒刺激为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回 对我来说,这是非常令人困惑甚至误导的,因为它不会阻塞,但它会将信号量计数减少1。因此,如果我这样使用它: If (!mySemaphore.WaitOne(0)) DoSomething(); 如果为true,它可能会减少我的信号量,导致其他线
If (!mySemaphore.WaitOne(0)) DoSomething();
如果为true,它可能会减少我的信号量,导致其他线程无法运行。所以我们不能像这样只测试信号量的状态。正确的用法应该是
If (!mySemaphore.WaitOne(0)) DoSomething();
Else mySemaphore.Release();
所以它不仅仅测试信号量的状态!我说的对吗?正确,它不仅测试信号量状态,还可以使用更好的措辞 如果毫秒刺激为零,则该方法不会阻塞。该方法尝试获取等待句柄,并在尝试成功或失败后立即返回 你的例子也不正确,正确的使用方法是
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.WaitOne返回true时,您应该只调用mySemaphore.Release,在您当前的示例中,您只在mySemaphore.WaitOne返回false时调用它。简单地测试而不递减是没有意义的,因为您得到的答案立即过时且无用,因为其他线程可以在为您编写答案供您阅读之后,但在您阅读之前更改该答案。@CodeCaster无视,我只是个哑巴。好吧,我可以同意,但是。。。想象一下相反的情况——当WaitOne0结果为true时——它不会改变信号量的状态,结果也就没有用了,因为同时另一个线程可能会释放信号量。你说得对,当mySemaphore.WaitOne0返回true时,它应该会做些什么,我刚刚编辑了我的帖子+1次尝试..最后部分提醒