异常后信号量超时

本文关键字:超时 信号量 异常 | 更新日期: 2023-09-27 17:49:42

我在管理来自多个模块的资源时遇到了一些麻烦,这些资源一次只能安全地访问一次。

所以我尝试了一个命名为Semaphore这样:

var semaphore = new Semaphore(1, 1, "_UGLY_SEMAPHORE_NAME_");
        try
        {
            var signaled = semaphore.WaitOne(120000); // 2 minutes
            if (!signaled)
            {
                return;
            }
            // Access the resource...
        }
        finally
        {
            semaphore.Release();
        }

在另一个模块中我使用

var signaled = semaphore.WaitOne(0); 

,因为资源只有在无事可做时才会被访问。它在6秒后稳定返回,所以我认为2分钟应该足够了。

所以问题是:

如果在第一个代码块中发生异常,则在semaphoore . waitone()之后总是跑到超时。我做错了什么

异常后信号量超时

处理过程中发生的异常不会导致任何其他线程等待信号量等待超时。finally块的语义意味着如果异常导致try块结束,它将执行,从而释放信号量。

我怀疑问题是,无论线程是否进入信号量,您都在调用sempahore.Release()。你应该只在代码路径进入信号量时调用Release,否则计数器可能会被抛出,因为你释放了一个没有获得的信号量。

var semaphore = new Semaphore(1, 1, "_UGLY_SEMAPHORE_NAME_");
var signaled = semaphore.WaitOne(120000); // 2 minutes
if (!signaled)
{
    return;
}
try
{
    // Access the resource...
}
finally
{
    semaphore.Release();
}