Это правильное использование мьютекса?
У меня есть ситуация, когда у меня может быть запущено несколько экземпляров программы одновременно, и важно, чтобы только одна конкретная функция не выполнялась более чем в одном из этих экземпляров одновременно.
Это правильный способ использовать мьютекс, чтобы предотвратить это?
lock (this.GetType()) {
_log.Info("Doing Sync");
DoSync();
_log.Info("Sync Completed");
}
2 ответа
Вы сказали, что несколько экземпляров одного приложения, так что мы говорим о двух запущенных 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();
}
}
Переменная createNew сообщит вам, был ли он создан в первый раз. Это только говорит вам, если он был создан, хотя. Если вы хотите получить блокировку, вам нужно вызвать WaitOne, а затем вызвать ReleaseMutex, чтобы снять ее. Если вы просто хотите увидеть, создали ли вы Mutex, просто создайте его.
Искатель правильный.
Совет Джеффа Рихтера в Clr Via C# (p638-9) о блокировке заключается в создании закрытого объекта специально для блокировки.
private Object _lock = new Object();
// usage
lock( _lock )
{
// thread-safe code here..
}
Это работает, потому что _lock не может быть заблокирован ничем вне текущего класса.
РЕДАКТИРОВАТЬ: это применимо к потокам, выполняющимся в рамках одного процесса. @ Дэвид Мохундро является правильным для межпроцессного блокирования.