3

2 つのプロセスを同期するために、名前付きシステム ミューテックス アプローチを試みています。

  1. ac# Windows サービス
  2. デスクトップ C# アプリ

ミューテックスが作成されると、ミューテックスを作成しなかったプロセスは既存のミューテックスを検出しないようです。以下に詳しく説明します。

Windows サービスは、次のようにミューテックス (グローバル/ローカルなどのプレフィックスなし。通常の名前付きシステム ミューテックス) の作成を担当します。

        Mutex myMutex= null;
        try
        {
            myMutex= Mutex.OpenExisting(myMutexName);

        }
        catch (WaitHandleCannotBeOpenedException x)
        {
            //doesn't exist. 
            try
            {
                this.GetLogger().Info("Create Mutex");
                bool createdNew = false;
                new Mutex(false, myMutexName, out createdNew);
                if (!createdNew) throw new Exception("Unable to create Mutex");

            }
            catch (Exception ex)
            {
                this.Stop();
            }

        }
        catch (Exception x)
        {
            this.Stop();
        }
        finally
        {

            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch(Exception x)
                {
                    this.GetLogger().Warn("Unable to release mutex");
                }
            }
        }

これは onStart() にあります。また、サービスの他の場所では、このミューテックスで同期します。

さて、アプリケーションでは次のように使用します。

            Mutex myMutex= null;

        try
        {
            myMutex= Mutex.OpenExisting(this.myMutexName);
            myMutex.WaitOne();
//do required stuff


        }
        catch (WaitHandleCannotBeOpenedException wcbox)
        {
            //doesn't exist yet. service not running??
            this.GetLogger().Error("Background Service is not Running");
            shutdownApp();
        }
        finally
        {
            if (myMutex!= null)
            {
                try
                {
                    myMutex.ReleaseMutex();
                }
                catch (Exception x)
                {
                }
            }
        }

私の問題:

  1. サービスが実行されていると、アプリは WaitHandleCannotBeOpenedException をスローします。これは、存在するミューテックスが表示されないことを意味します (ツール「WinObj」を使用してこれを確認しました。ミューテックスは「BaseNamedObjects」の下にタイプ「Mutant」として存在します)。なんで?ログインしているのと同じアカウントでサービスを実行しています。それがなくても、名前付きミューテックスはオペレーティング システム全体のオブジェクトなので、問題にはなりませんか?

  2. ミューテックスがいつ破棄されるかは正確にはわかりません。現在、サービスを開始するとミューテックスが作成され、サービスを停止するとミューテックスが存在しないことがわかります(WinObj)。それは、ミューテックスを待っている人がいないとき、およびクリエータープロセスが終了したときに、ミューテックスがガベージコレクションされることを意味しますか?

  3. 一般に、名前付きシステム ミューテックスのライフ サイクルはどのようなものですか。具体的には、いつ死ぬのですか?

4

2 に答える 2

4

セッション間でミューテックスを共有したいので、名前空間を使用するか、独自のプライベート名前空間Globalを作成する必要があります。

現状では、名前空間を指定していません。サービスはデフォルトでグローバル名前空間を使用しますが、対話型アプリケーションはローカル名前空間を使用します。

于 2013-01-23T21:10:08.747 に答える