3

このような EventWaitHandle を開いて Windows サービスによってトリガーされる C# プログラムを取得しました。

EventWaitHandle sampleEventHandle = new EventWaitHandle(false, EventResetMode.AutoReset, "Global\\sampleEvent");

プログラムが強制終了される (または予期しないエラーが原因で終了する) と、EventWaitHandle が閉じられず、プログラムを再起動すると、次のエラーが発生します。

System.UnauthorizedAccessException: パスへのアクセスが拒否されました。
System.IO.__Error.WinIOError (Int32 errorCode、文字列の多分フルパス)
で System.Threading.EventWaitHandle..ctor (ブール値の initialState、EventResetMode モード、文字列名) で

1 分後、EventWaitHandle が閉じられ、アプリケーションを再起動できます。

この問題を解決する方法はありますか?

4

1 に答える 1

2

これは、サービスの同じオブジェクトでハンドルが開かれているために発生します。結局のところ、これを使用してサービスとプログラム間のシグナリングを実装しているのです。物理的に基盤となるWindowsの名前付きオブジェクトは、最後のハンドルが閉じられるまでグローバル名前空間から削除されません。

したがって、これで例外を取得すると、実際の問題診断が得られます。サービスは間違ったハンドルを使用しており、プログラムを再起動したときに通信できません。1分後にこれがどのように解決されるかを推測するのは難しいので、サービスが定期的にOpenExisting()を呼び出すと想定する必要があります。

解決策は簡単です。待機ハンドルを作成するのはサービスであり、UIプログラムはOpenExisting()を呼び出す必要があります。少なくともサービスが有効である限り、イベントは常に存在します。そうでない場合は、OpenExisting()を使用すると、WaitHandleCannotBeOpenedExceptionを使用してその優れた診断を行うことができます。

于 2012-06-21T22:23:41.153 に答える