我正在使用Mutex来确保Web服务一次仅运行一次,但是使用WaitOnce和ReleaseMutex不能使其100%正确。

我有这个:

    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;
    }


我尝试立即访问Web服务两次,第二次调用未返回false,但是我从Mutex.ReleaseMutex获取了ApplicationException(“对象同步方法是从onsyncronized代码块中调用的”-大致翻译自瑞典语)

最好的方法是什么?

最佳答案

无论您的ReleaseMutex是否返回true,您都在呼叫WaitOne。仅当您设法获取ReleaseMutex时,才应呼叫它:

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


您的互斥锁是否被多个进程或AppDomain使用?如果不是,则普通的CLR监视器(使用Monitor.TryEnter)会更轻。

10-04 13:46