Question

J'ai une situation où je pourrais avoir plusieurs instances d'un programme en cours d'exécution à la fois, et il est important que juste une fonction spécifique de ne pas être en cours d'exécution dans plus d'une de ces instances à la fois.

Est-ce la bonne façon d'utiliser un mutex pour empêcher que cela se produise?

lock (this.GetType()) {
    _log.Info("Doing Sync");
    DoSync();
    _log.Info("Sync Completed");
}
Était-ce utile?

La solution

Vous avez dit plusieurs instances d'une application, de sorte que nous parlons de deux program.exe s'en cours d'exécution, droit?L'instruction lock de ne pas verrouiller à travers de multiples programmes, juste à l'intérieur du programme.Si vous voulez un vrai Mutex, regardez le Système.Le filetage.Mutex objet.

Voici un exemple d'utilisation:

bool createdNew;
using (Mutex mtx = new Mutex(false, "MyAwesomeMutex", out createdNew))
{
    try
    {
        mtx.WaitOne();

        MessageBox.Show("Click OK to release the mutex.");
    }
    finally
    {
        mtx.ReleaseMutex();
    }
}

Le createdNew variable vous permettra de savoir si oui ou non il a été créé la première fois.Il vous dira si elle a été créée, mais.Si vous souhaitez acquérir le verrou, vous devez appeler WaitOne et ensuite appeler ReleaseMutex pour le libérer.Si vous voulez juste pour voir si vous avez créé un Mutex, juste de la construction, il est très bien.

Autres conseils

TheSeeker est correct.

Jeff Richter conseils Clr Via C# (p638-9) sur le verrouillage est de créer un objet privé, précisément dans le but d'être enfermé.

private Object _lock = new Object();

// usage
lock( _lock )
{
    // thread-safe code here..
}

Cela fonctionne parce que _lock ne peut pas être verrouillé par quoi que ce soit à l'extérieur de la classe.

EDIT:ceci est applicable pour les threads s'exécutant au sein d'un seul processus.@David Mohundro réponse est bonne pour l'inter-processus de verrouillage.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top