3

Mutex を使用して Web サービスが一度に 1 回だけ実行されるようにしていますが、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 サービスに 2 回アクセスしようとすると、2 回目の呼び出しで false が返されませんが、mutex.ReleaseMutex から ApplicationException が発生します ("objectsyncronization メソッドが onsyncronized コードブロックから呼び出されました" - スウェーデン語から大まかに翻訳)

これを行う最善の方法は何ですか?

4

1 に答える 1

7

返された trueReleaseMutexかどうかを呼び出しています。取得できた場合に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 に答える