4

xml ファイルを読み取るサービスがいくつかあります。衝突がないことを確認するために、ミューテックスを使用します。何らかの理由で、すべてのサービスが同じユーザーによって実行されていれば問題ありません。ただし、これらのサービスを実行している別のユーザーがいる場合、一方のサービスがミューテックスを解放した後でも、ルート ミューテックスに入るを呼び出すと、もう一方のサービスは次の例外を取得します。例外。 ---> System.UnauthorizedAccessException: パス 'RETEST_MUTEX' へのアクセスが拒否されました。"

    public static readonly String ROUTE_MUTEX_STRING = "RETEST_MUTEX";
    private static Mutex _routeMutex = new Mutex(false, ROUTE_MUTEX_STRING);

    /// <summary>
    /// Thin wrapper around the static routeMutex WaitOne method
    /// Always call ExitRouteMutex when done in protected area
    /// </summary>
    /// <param name="millis_timeout"></param>
    /// <returns>true if signaled, like WaitOne</returns>
    public static bool EnterRouteMutex(int millis_timeout)
    {
        try
        {
            return _routeMutex.WaitOne(millis_timeout, false);
        }
        catch (AbandonedMutexException ame)
        {
            // swallow this exception - don't want to depend on other apps being healthy - like pre .NET 2.0 behavior
            // data integrity will be checked
            return _routeMutex.WaitOne(millis_timeout, false);
        }

    }

    public static void ExitRouteMutex()
    {
        try
        {
            _routeMutex.ReleaseMutex();
        }
        catch (ApplicationException)
        {
            // swallow, reduce complexity to client
        }
    }

    static void Main(string[] args)
    {
        Console.WriteLine("Start");
        bool get = EnterRouteMutex(1000);
        System.Console.WriteLine("Mutex created Press enter " + get.ToString());
        Console.ReadLine();            
        ExitRouteMutex();
        Console.WriteLine("Mutex Release");
        System.Console.WriteLine("Press enter");
        Console.ReadLine();
    }
4

1 に答える 1

3

クロスプロセス Mutex を実行する例を次に示します。

http://msdn.microsoft.com/en-us/library/c41ybyt3.aspx

Mutex.OpenExisting の使用を処理し、cdhowie で言及されているセキュリティの側面も示します。

于 2012-12-26T22:32:09.970 に答える