异常后信号量超时

时间:2014-03-12 20:29:20

标签: c# multithreading try-catch semaphore

从多个模块管理资源时遇到一些问题,这些模块只能安全地访问一次。

所以我尝试了这样一个名为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分钟应该足够我相信了。

所以问题是:

如果第一个代码块发生异常,之后是Semaphore.WaitOne() 总是遇到超时。我有一些错误。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我怀疑问题是你正在调用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();
}