首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.NET 4.5信号量WaitOne(0)不阻塞,但信号量减少

.NET 4.5信号量WaitOne(0)不阻塞,但信号量减少
EN

Stack Overflow用户
提问于 2014-11-04 15:31:49
回答 1查看 2K关注 0票数 0

直到文档 of .NET 4.5,如果我在信号量类的某个对象(通常是WaitHandle类)上使用WaitOne(Int32)方法,其参数为0(0),则它不阻塞,可用于测试信号量的当前状态:

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

对我来说,这非常令人困惑(甚至误导),因为它不阻塞,但它会减少一个信号量计数。所以如果我像这样使用它:

代码语言:javascript
复制
If (!mySemaphore.WaitOne(0)) DoSomething();

然后,它可能会减少我的信号量(如果为真),导致其他线程无法运行。因此,我们不能像这样使用它来测试信号量的状态。正确的使用应该是

代码语言:javascript
复制
If (!mySemaphore.WaitOne(0)) DoSomething();
Else mySemaphore.Release();

所以它不仅测试信号量的状态!我说的对吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-04 15:40:06

正确,它不仅测试信号量状态,更好的措辞是

如果millisecondsTimeout为零,则该方法不会阻塞。该方法尝试接受等待句柄,并在该尝试成功或失败时立即返回。

另外,您的示例是不正确的,正确的使用方法应该是

代码语言:javascript
复制
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时才调用它。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26738972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档