【发布时间】:2014-03-12 20:29:19
【问题描述】:
我在管理来自多个模块的资源时遇到了一些麻烦,这些模块一次只能安全访问一次。
所以我尝试了一个像这样命名的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() 总是遇到超时。我做错了什么。
【问题讨论】:
-
异常发生在哪里?是在“// Access the resource...”中,还是在谈论奇怪的边缘情况,在不寻常的地方出现类似线程中止异常?
-
是的。它在该代码之外处理并调用 finally。我对“发布增量和 WaitOne 减量”部分感到有些困惑。
-
然后查看
Semaphore的文档,或者在Google上查找;这是一个定义合理的 CS 概念。 -
你是对的,有很多文档。但如果我能在那里找到答案,我真的不会问这个问题。
-
如果你想要互斥,那么你应该使用
Mutex而不是Semaphore。
标签: c# multithreading try-catch semaphore