3

我正在使用互斥锁来确保 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(“objectsyncronization 方法是从 onsyncronized 代码块调用的” - 大致翻译自瑞典语)

最好的方法是什么?

4

1 回答 1

7

你打电话给你ReleaseMutex是否WaitOne返回真实。ReleaseMutex只有当你设法获得它时,你才应该打电话:

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

顺便说一句,您的互斥锁是否被多个进程或 AppDomains 使用?如果没有,普通的 CLR 监视器(使用Monitor.TryEnter)会更轻。

于 2009-06-09T13:55:49.290 回答