Просто написал простую программу, которую нужно обрабатывать один раз, поэтому для этого нужно использовать ключ Mutex
с определенным именем.
Код (упрощенный) выглядит так.
static readonly string APP_NAME = "MutexSample";
static void Main(string[] args)
{
Mutex mutex;
try
{
mutex = Mutex.OpenExisting(APP_NAME);
// At this point, with no exception,
// the Mutex is acquired, so there is another
// process running
// Environment.Exit(1); or something
}
catch (WaitHandleCannotBeOpenedException)
{
// If we could not acquire any mutex with
// our app name, let's create one
mutex = new Mutex(true, APP_NAME);
}
Console.ReadKey(); // Just for keeping the application up
// At some point, I just want to release
// the mutex
mutex.ReleaseMutex();
}
Моя первая попытка заключалась в создании экземпляра Mutex
как new Mutex(false, APP_NAME)
, но при вызове mutex.ReleaseMutex()
генерировалось исключение
System.ApplicationException: 'Object synchronization method was called from an unsynchronized block of code.'
Только что заметил, что первый параметр конструктора (initiallyOwned
) отмечает, владеет ли им текущий поток, создающий Mutex
, и, что неудивительно, поток не может освободить Mutex
, который не принадлежит этому потоку.
Таким образом, изменение этого параметра на true
устранило эту проблему, как показано в приведенном выше коде.
Ну, у меня вопрос, в чем весь смысл этого параметра? Я имею в виду, когда мне нужно будет создать Mutex
, которое я не могу выпустить.
И, если я установлю для параметра initiallyOwned
значение false
, кто действительно владеет этим Mutex
?
Спасибо.