从多个模块管理资源时遇到一些问题,这些模块只能安全地访问一次。
所以我尝试了这样一个名为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() 总是遇到超时。我有一些错误。
答案 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();
}