Я пытаюсь использовать именованный системный мьютекс для синхронизации двух процессов:
- служба Windows С#
- настольное приложение С#
Когда мьютекс создается, процесс, который не создавал мьютекс, похоже, не обнаруживает существующий мьютекс. Ниже более подробно:
Служба Windows отвечает за создание мьютекса (без префиксов — глобальный/локальный и т. д. Просто обычный именованный системный мьютекс) следующим образом:
Mutex myMutex= null;
try
{
myMutex= Mutex.OpenExisting(myMutexName);
}
catch (WaitHandleCannotBeOpenedException x)
{
//doesn't exist.
try
{
this.GetLogger().Info("Create Mutex");
bool createdNew = false;
new Mutex(false, myMutexName, out createdNew);
if (!createdNew) throw new Exception("Unable to create Mutex");
}
catch (Exception ex)
{
this.Stop();
}
}
catch (Exception x)
{
this.Stop();
}
finally
{
if (myMutex!= null)
{
try
{
myMutex.ReleaseMutex();
}
catch(Exception x)
{
this.GetLogger().Warn("Unable to release mutex");
}
}
}
У меня есть это в onStart(). Кроме того, в другом месте службы я синхронизируюсь по этому мьютексу.
Теперь в приложении я использую это так:
Mutex myMutex= null;
try
{
myMutex= Mutex.OpenExisting(this.myMutexName);
myMutex.WaitOne();
//do required stuff
}
catch (WaitHandleCannotBeOpenedException wcbox)
{
//doesn't exist yet. service not running??
this.GetLogger().Error("Background Service is not Running");
shutdownApp();
}
finally
{
if (myMutex!= null)
{
try
{
myMutex.ReleaseMutex();
}
catch (Exception x)
{
}
}
}
Мои проблемы:
Когда служба запущена, приложение генерирует исключение WaitHandleCannotBeOpenedException, что означает, что оно не видит существующий мьютекс (я проверил это с помощью инструмента «WinObj», мьютекс существует в разделе «BaseNamedObjects» как тип «Мутант»). Почему? Я запускаю службу под той же учетной записью, с которой я вошел в систему. Даже без нее это не должно быть проблемой, потому что именованный мьютекс является общесистемным объектом, верно?
Я не совсем понимаю, когда мьютекс будет уничтожен. В настоящее время я вижу, что мьютекс создается при запуске службы, а когда я останавливаю службу, я вижу, что мьютекс больше не существует (WinObj). Означает ли это, что мьютекс является сборщиком мусора, когда его никто не ждет и когда процесс-создатель завершается?
В общем, каков жизненный цикл именованного системного мьютекса. В частности, когда он умирает?