我遇到一种情况,我可能会同时运行一个程序的多个实例,并且重要的是,不要同时在多个实例中执行一个特定函数。

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

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
有帮助吗?

解决方案

您说的是一个应用程序的多个实例,所以我们谈论的是两个program.exe 正在运行,对吧?lock 语句不会跨多个程序加锁,而只会在程序内加锁。如果你想要一个真正的互斥体,请查看 系统.线程.互斥体 目的。

这是一个用法示例:

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释放锁。如果您只想查看是否创建了互斥锁,那么只需构建它就可以了。

其他提示

探索者是正确的。

杰夫·里克特的建议 通过 C# 清除 (p638-9)关于锁定就是专门为了被锁定的目的而创建一个私有对象。

private Object _lock = new Object();

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top