2009-06-09 5 views
3

J'utilise un Mutex pour m'assurer qu'un webservice fonctionne seulement une fois à la fois, mais je ne peux pas l'obtenir à 100% avec WaitOnce et ReleaseMutex..NET: Utilisation de Mutex pour m'assurer qu'un webservice n'est appelé qu'une seule fois

J'ai ceci:

private static Mutex mutex = new Mutex(); 

    [WebMethod] 
    public bool TriggerAll() 
    { 
     bool ranJobs = false; 
     try 
     { 
      if (mutex.WaitOne(0, false)) 
      { 
       Thread.Sleep(10000); // simulate a long operation 
       ranJobs = true; 
      } 
     } 
     finally 
     { 
      mutex.ReleaseMutex(); 
     } 
     return ranJobs; 
    } 

I'f J'essaie d'accéder au webservice deux fois de suite, le second appel ne retourne pas faux, mais je reçois un ApplicationException de mutex.ReleaseMutex ("méthode objectsyncronization a été appelé à partir d'un codeblock suryncronisé "- à peu près traduit de suédois)

Quelle est la meilleure façon de le faire?

Répondre

7

Vous appelez ReleaseMutex si votre WaitOne a renvoyé true. Vous ne devez appeler ReleaseMutex si vous avez réussi à acquérir:

if (mutex.WaitOne(0, false)) 
    { 
     try 
     { 
      Thread.Sleep(10000); // simulate a long operation 
      ranJobs = true; 
     } 
     finally 
     { 
      mutex.ReleaseMutex(); 
     } 
    } 

Est-ce votre mutex être utilisé par plusieurs processus ou AppDomains par la voie? Sinon, un moniteur CLR normal (utilisant Monitor.TryEnter) serait plus léger.

Questions connexes