我在管理来自多个模块的资源时遇到了一些麻烦,这些资源一次只能安全地访问一次。
所以我尝试了一个命名为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();
}