J'ai le code suivant :
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run at the same time in another process
}
}
J'ai placé un point d'arrêt dans le if
et exécuté le même code dans une autre instance de Visual Studio. Comme prévu, le .WaitOne
blocs d'appels. Cependant, à ma grande surprise, dès que j'ai continuer en première instance et le using
se termine, je reçois une exception dans le second processus à propos d'un Mutex abandonné.
La solution consiste à appeler ReleaseMutex
:
using (Mutex mut = new Mutex(false, MUTEX_NAME))
{
if (mut.WaitOne(new TimeSpan(0, 0, 30)))
{
// Some code that deals with a specific TCP port
// Don't want this to run twice in multiple processes
}
mut.ReleaseMutex();
}
Maintenant, les choses fonctionnent comme prévu.
Ma question : Habituellement, le point d'une IDisposable
c'est nettoie quel que soit l'état dans lequel vous mettez les choses. Je pourrais peut-être avoir plusieurs attend y libère dans un using
mais lorsque l'identifiant du Mutex est éliminé, ne devrait-il pas être libéré automatiquement ? En d'autres termes, pourquoi dois-je appeler ReleaseMutex
si je suis dans une using
bloc ?
Je suis également préoccupé par le fait que, si le code dans l'application if
le bloc se plante, j'aurai des mutex abandonnés qui traînent.
Y a-t-il un avantage à mettre Mutex
dans un using
bloc ? Ou, devrais-je simplement nouveau a Mutex
l'envelopper dans un try/catch, et appeler ReleaseMutex()
au sein de la enfin (qui met en œuvre exactement ce que je pensée Dispose()
ferait)
0 votes
Sachant ce que je sais des mutex (conceptuellement), j'imagine que lorsque Dispose() est appelé sur le Mutex, il vérifie s'il est toujours utilisé. Si c'est le cas, j'imagine qu'il ne s'élimine pas lui-même (et il ne devrait pas !). J'aimerais cependant obtenir des informations supplémentaires à ce sujet, de la part de quelqu'un qui connaît mieux les mécanismes internes de l'environnement Mutex.
Mutex
en .Net.0 votes
Le point de
using
est juste d'appelerDispose
à la fin. Il est traduit entry{ //yourcode } finally { yourobj.Dispose() }
... si vous avez besoin de plus de logique (comme la libération dans ce cas), vous devez la gérer vous-même.0 votes
L'utilisez-vous dans plusieurs processus, ou êtes-vous seulement concerné par les fils multiples dans le même processus ?
0 votes
@voithos - Processus multiples, c'est pourquoi le Mutex a un nom.