Można użyć klasy System.Threading.Mutex, która ma metodę OpenExisting do otwierania nazwanego systemu mutex.
To nie jest odpowiedź na pytanie:
Jak mogę utworzyć Mutex System/wieloprocesowej
Aby utworzyć mutex całego systemu, należy zadzwonić pod System.Threading.Mutex konstruktor, który przyjmuje ciąg jako argument. Jest to również znane jako "nazwany" muteks. Aby sprawdzić, czy istnieje, nie wydaje się znaleźć sposób więcej wdzięku niż próbować haczyk:
System.Threading.Mutex _mutey = null;
try
{
_mutey = System.Threading.Mutex.OpenExisting("mutex_name");
//we got Mutey and can try to obtain a lock by waitone
_mutey.WaitOne();
}
catch
{
//the specified mutex doesn't exist, we should create it
_mutey = new System.Threading.Mutex("mutex_name"); //these names need to match.
}
Teraz, aby być dobrym programistą, trzeba, po zakończeniu programu, należy zwolnić ten mutex
_mutey.ReleaseMutex();
lub można go zostawić, w takim przypadku zostanie on nazwany "porzucony", gdy wątek zostanie zamknięty, i pozwoli na utworzenie innego procesu.
[EDIT]
marginesie do ostatniego zdania opisującego mutex, który jest opuszczony, gdy inny wątek nabywa mutex, wyjątek System.Threading.AbandonedMutexException
zostanie rzucony mówiąc mu, że został znaleziony w opuszczonym stanie.
[EDIT TWO]
Nie jestem pewien, dlaczego odpowiedział na pytanie w ten sposób rok temu; istnieje (i było) przeciążenie konstruktora, które jest o wiele lepsze w sprawdzaniu istniejącego muteksu. W rzeczywistości kod, który dałem, zdaje się mieć warunek wyścigowy! (I wstydźcie się wszyscy, że mnie nie poprawiliście!) :-P)
Oto stan wyścigu: Wyobraźcie sobie dwa procesy, obaj próbują otworzyć istniejący muteks w tym samym czasie, a obaj dostaną się do sekcji catch kodu . Następnie jeden z procesów tworzy muteks i żyje długo i szczęśliwie. Drugi proces próbuje jednak utworzyć muteks, ale tym razem jest już stworzony! To sprawdzenie/utworzenie muteksu musi być atomowe.
http://msdn.microsoft.com/en-us/library/bwe34f1k(v=vs.90).aspx
Więc ...
var requestInitialOwnership = false;
bool mutexWasCreated;
Mutex m = new Mutex(requestInitialOwnership,
"MyMutex", out mutexWasCreated);
myślę Sztuką jest to, że wydaje się, że masz możliwość, że nie mamy (wygląda jak wada projektu do mnie). Czasami nie można stwierdzić, czy jesteś właścicielem mutex jeśli wyślesz true
dla requestInitialOwnership
. Jeśli zdasz true
i wydaje się, że rozmowa utworzony mutex, to oczywiście należy do Ciebie (potwierdzone dokumentacją). Jeśli zdasz true
i rozmowa nie stworzył mutex, wszystko co wiem jest to, że mutex został już utworzony, nie wiem, czy jakiś inny proces lub wątek, który może tworzony mutex posiada obecnie mutex. Musisz więc upewnić się, że masz WaitOne
. Ale jak często robisz to Release
? Jeśli jakiś inny proces własnością mutex kiedy masz go, to tylko twoja wyraźne wezwanie do WaitOne
musi być Release
d. Jeśli wywołanie konstruktora spowodowało Ci właścicielem mutex, a nazywa WaitOne
wyraźnie, trzeba dwa Release
s.
włożę te słowa na kod:
var requestInitialOwnership = true; /*This appears to be a mistake.*/
bool mutexWasCreated;
Mutex m = new Mutex(requestInitialOwnership,
"MyMutex", out mutexWasCreated);
if (!mutexWasCreated)
{
bool calledWaitOne = false;
if (! iOwnMutex(m)) /*I don't know of a method like this*/
{
calledWaitOne = true;
m.WaitOne();
}
doWorkWhileHoldingMutex();
m.Release();
if (calledWaitOne)
{
m.Release();
}
}
Ponieważ nie widzę sposobu, aby sprawdzić, czy jesteś właścicielem tego mutex, będę zalecamy przejść false
do konstruktora, tak aby wiesz, że nie jesteś właścicielem muteksu i wiesz, ile razy dzwonisz pod numer Release
.
Oto zawinięte klasy, który obsługuje między blokowanie procesu i opuszczonych warunki MUTEX https://github.com/blinemedical/Inter-process-mutex – devshorts