Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET 4.5信号量WaitOne(0)不阻塞,但会减少信号量计数_C#_.net - Fatal编程技术网

C# .NET 4.5信号量WaitOne(0)不阻塞,但会减少信号量计数

C# .NET 4.5信号量WaitOne(0)不阻塞,但会减少信号量计数,c#,.net,C#,.net,在.NET 4.5版本之前,如果我在信号量类或-通常-WaitHandle类的某个对象上使用WaitOneInt32方法(参数为0 0),它不会阻塞,并且可能用于测试信号量的当前状态: 如果毫秒刺激为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回 对我来说,这是非常令人困惑甚至误导的,因为它不会阻塞,但它会将信号量计数减少1。因此,如果我这样使用它: If (!mySemaphore.WaitOne(0)) DoSomething(); 如果为true,它可能会减少我的信号量,导致其他线

在.NET 4.5版本之前,如果我在信号量类或-通常-WaitHandle类的某个对象上使用WaitOneInt32方法(参数为0 0),它不会阻塞,并且可能用于测试信号量的当前状态:

如果毫秒刺激为零,则该方法不会阻塞。它测试等待句柄的状态并立即返回

对我来说,这是非常令人困惑甚至误导的,因为它不会阻塞,但它会将信号量计数减少1。因此,如果我这样使用它:

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次尝试..最后部分提醒