【发布时间】:2011-01-20 18:09:14
【问题描述】:
如果您在应用程序中有两个线程,并且您不希望它们同时运行某段代码,您可以锁定该段代码,如下所示:
lock (someObject) {
// ... some code
}
但是你如何在不同的进程中做同样的事情呢?我认为这就是你使用“全局互斥锁”的目的,所以我尝试了Mutex 类以各种方式,但它似乎无法满足我的要求,即:
- 如果您是唯一的实例,请继续运行代码。
- 如果您是第二个实例,请等待第一个实例完成,然后运行代码。
- 不要抛出异常。
我遇到的问题:
- 只是在
using(){...}子句中实例化Mutex对象似乎没有任何作用;这两个实例仍然可以愉快地同时运行 - 在 Mutex 上调用
.WaitOne()会导致第一个实例运行,第二个实例等待,但第二个实例无限期地等待,即使在第一个调用.ReleaseMutex()并离开using(){}范围之后也是如此。 -
.WaitOne()在第一个进程退出时抛出异常 (System.Threading.AbandonedMutexException)。
我该如何解决这个问题?非常欢迎不涉及 Mutex 的解决方案,尤其是因为 Mutex 似乎是特定于 Windows 的。
【问题讨论】:
-
您正在使用 .NET,并抱怨
Mutex是特定于 Windows 的? -
@Anon.: mono-project.com/Main_Page
-
@Randolpho:谁的目标是实现整个 .NET 库。包括
System.Threading.Mutex。如果它是 .NET 库的一部分,您可以期望它在任何 .NET 平台上运行(包括单声道,一旦它完成了它的那部分实现)。 -
哦,我知道了。我只是说'
标签: c# .net mutex mutual-exclusion