我的情况是,我可能会同时运行多个程序实例,并且重要的是一次只能在一个以上的实例中执行一个特定的函数。
这是使用互斥锁来防止这种情况发生的正确方法吗?
lock (this.GetType()) {
_log.Info("Doing Sync");
DoSync();
_log.Info("Sync Completed");
}
答案 0 :(得分:19)
你说过一个应用程序的多个实例,所以我们说的是两个program.exe正在运行,对吧?锁定语句不会在程序内锁定多个程序。如果您想要一个真正的Mutex,请查看System.Threading.Mutex对象。
以下是一个用法示例:
bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
try
{
mtx.WaitOne();
MessageBox.Show("Click OK to release the mutex.");
}
finally
{
mtx.ReleaseMutex();
}
}
createdNew变量将让您知道它是否是第一次创建的。但它只会告诉您它是否已创建。如果要获取锁定,则需要调用WaitOne,然后调用ReleaseMutex将其释放。如果您只想查看是否创建了Mutex,只需构建它就可以了。
答案 1 :(得分:5)
TheSeeker是正确的。
Jeff Richter在Clr Via C#(p638-9)中关于锁定的建议是专门为了被锁定而创建一个私有对象。
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
这是有效的,因为_lock不能被当前类之外的任何东西锁定。
编辑:这适用于在单个进程中执行的线程。 @David Mohundro的答案对于进程间锁定是正确的。