2009-06-09 77 views
3

我使用互斥来确保web服务一次只运行一次,但是我无法100%正确地使用它WaitOnce和ReleaseMutex。NET:使用Mutex来确保一次只调用一次web服务

我有这样的:

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我尝试两次立即访问web服务,第二个电话不返回false,但我从一个mutex.ReleaseMutex ApplicationException的(“objectsyncronization方法被称为“同步代码块” - 粗略翻译自瑞典语)

这样做的最佳方式是什么?

回答

7

您在致电ReleaseMutex您的WaitOne是否返回true。你应该只调用ReleaseMutex,如果你设法得到它:

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

是否使用你的互斥量被多个进程或应用程序域的方式?如果没有,一个正常的CLR监视器(使用Monitor.TryEnter)会更轻。