Почему вы не можете использовать Mutex.OpenExisting
try
{
Mutex foundMutex = Mutex.OpenExisting("MyTestingMutex");
// Found Mutex
foundMutex.ReleaseMutex();
}
catch (System.Threading.WaitHandleCannotBeOpenedException)
{
// System.Threading.WaitHandleCannotBeOpenedException:
// The named mutex does not exist.
}
EDIT
Я думаю, кое-что из этого.
Похоже, вы пытаетесь разработать API. InterProcessLock - это один из элементов, который вы предлагаете в своем API.
Я предполагаю, что вы делитесь коллекцией между потоками и используете Mutex, чтобы убедиться, что за один раз выполняется только одна операция.
using (InterProcessLock myLock = new InterProcessLock("LockMutex", TimeSpan.FromMilliseconds(100.0)))
{
if(myLock.IsAcquired)
{
// I have control then I can delete, add to the collection.
}
}
Я бы пересмотрел этот дизайн. Что делать, если я никогда не завернул InterProcessLock myLock = new InterProcessLock("LockMutex", TimeSpan.FromMilliseconds(100.0))
в использование? Утилизация не будет называться. Что если пользователь вообще никогда не вызывает Dispose?
Там будет заброшенный мьютекс
С MSDN
Внимание!
Заброшенный мьютекс часто указывает на серьезную ошибку в коде. Когда поток выходит без освобождения мьютекса, структуры данных, защищенные мьютексом, могут быть не согласованы. Следующий поток, запрашивающий владение мьютексом, может обработать это исключение и продолжить работу, если можно проверить целостность структур данных.
Если вы пытаетесь защитить своих пользователей, возможно, вы захотите помочь им, контролируя Mutex для них, чтобы им никогда не приходилось об этом беспокоиться.
Возможный пример:
public static bool PerformLockedProcess(Action process, string commonLockName, TimeSpan timeout)
{
Mutex mutex = null;
// Get the Mutex for the User
try
{
bool created;
var security = new MutexSecurity();
security.AddAccessRule(new MutexAccessRule(new SecurityIdentifier(WellKnownSidType.WorldSid, null), MutexRights.Synchronize | MutexRights.Modify, AccessControlType.Allow));
mutex = new Mutex(false, commonLockName, out created, security);
bool acquired = mutex.WaitOne(timeout);
if (acquired)
{
process();
return true;
}
return false;
}
finally
{
// Make sure we do not abandon the Mutex
if (mutex != null)
{
try
{
mutex.ReleaseMutex();
}
catch (ApplicationException)
{
// In case that failes
}
}
}
}
Это один из возможных способов. Все зависит от цели. Я бы НЕ передавал конечному пользователю вызов Dispose, поскольку Mutex - это конструкция операционной системы. И если имя не является лишним, это может повлиять на другие процессы, использующие то же имя мьютекса.