.NET: Использование Mutex, чтобы убедиться, что веб-сервис вызывается только один раз за раз - PullRequest
3 голосов
/ 09 июня 2009

Я использую Mutex, чтобы убедиться, что веб-сервис работает только один раз, но я не могу сделать это на 100% правильно с WaitOnce и ReleaseMutex.

У меня есть это:

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

Если я попытаюсь сразу дважды получить доступ к веб-сервису, второй вызов не возвращает false, но я получаю исключение ApplicationException от mutex.ReleaseMutex («метод воззвания объектов был вызван из синхронизированного кодового блока» - грубо переводится с шведского)

Какой лучший способ сделать это?

1 Ответ

7 голосов
/ 09 июня 2009

Вы звоните ReleaseMutex независимо от того, вернул ли ваш WaitOne истину. Вам следует звонить ReleaseMutex только в том случае, если вам удалось его приобрести:

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

Кстати, ваш мьютекс используется несколькими процессами или доменами приложений? Если нет, обычный монитор CLR (с использованием Monitor.TryEnter) будет легче.

...