2008-09-05 41 views
9

我有一种情况,我可能同时运行一个程序的多个实例,重要的是只有一个特定的函数不能同时在这些实例中的多个实例中执行。这是一个互斥体的正确使用吗?

这是使用互斥锁来防止这种情况发生的正确方法吗?

lock (this.GetType()) { 
    _log.Info("Doing Sync"); 
    DoSync(); 
    _log.Info("Sync Completed"); 
} 

回答

18

你说一个应用程序的多个实例,所以我们说的是两个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来释放它。如果你只是想看看你是否创建了一个互斥锁,只需构造它就没问题。

5

TheSeeker是正确的。

Jeff Richter在Clr Via C#(p638-9)上对锁定的建议是专门为锁定目的创建一个专用对象。

private Object _lock = new Object(); 

// usage 
lock(_lock) 
{ 
    // thread-safe code here.. 
} 

这是有效的,因为_lock不能被当前类以外的任何东西锁定。

编辑:这适用于在单个进程内执行的线程。 @David Mohundro的回答对于进程间锁定是正确的。