9

我有一种情况,我可能同时运行一个程序的多个实例,重要的是只有一个特定函数不能同时在多个这些实例中执行。

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

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

2 回答 2

18

你说的是一个应用程序的多个实例,所以我们说的是两个 program.exe 正在运行,对吗?lock 语句不会跨多个程序锁定,只是在程序内。如果您想要一个真正的 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,只要构建它就可以了。

于 2008-09-05T21:38:56.950 回答
5

TheSeeker 是正确的。

Jeff Richter 在Clr Via C# (p638-9) 中关于锁定的建议是专门为被锁定目的创建私有对象。

private Object _lock = new Object();

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

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

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

于 2008-09-05T21:27:30.597 回答