16

システムMutexでロック(クロスプロセス)したい共通データベースを持つ2つのWindowsサービスに取り組んでいます。

WaitOne()今、私はただ呼び出してブロックReleaseMutex()で大丈夫なのか、それともtry-finallyミューテックスも(たとえばusingブロックで)破棄するべきなのか疑問に思っています。もしそうなら、私は常にメソッドをキャッチする必要があると思いAbandonedMutexExceptionますか、WaitOne()それとも私はここで間違っていますか?

4

3 に答える 3

17

ミューテックスはWindowsカーネルオブジェクトです(ここでは.NETオブジェクトでラップされています)。

そのため、廃棄する必要があるのは管理されていないリソースです。

より正確には、.NETオブジェクトにはミューテックスへのHANDLEが含まれています。これは、何らかの方法で解放/破棄する必要があります。

私は、mutexオブジェクトが破棄されていないMutexクラスのドキュメントにあるそのコードサンプルを信頼していません。Henziのコメントには良い点がありますが、Mutexオブジェクトは静的であり、ファイナライザーによって破棄されるか、プロセスの終了時にWindowsカーネルによって破棄されます。

また、 Close()はオブジェクトも破棄することに注意してください。

もちろん、既存のMutexオブジェクトを使用していなくても、アプリに保持しても問題はありません。それらは軽い資源です。

于 2011-08-18T12:12:39.540 に答える
11

これによると、そのMutexを保持している最後のプロセスが終了すると、namedMutexは自動的に破棄されます。HANDLE

管理されていない用語でMSDNは言う

関数を使用しCloseHandleてハンドルを閉じます。プロセスが終了すると、システムはハンドルを自動的に閉じます。ミューテックスオブジェクトは、最後のハンドルが閉じられると破棄されます。

.NETでは.Close()、 -を呼び出す必要がありますMutex-これはリリースします...同じ名前のアクセスでもHANDLEすべてのプロセスが独自のものになるため、これは一貫した慣行です...プロセスが終了すると、呼び出さなくても問題は発生しません(ファイナライザーとすべて)...HANDLEMutexClose()

于 2011-08-18T12:36:45.667 に答える
2

ウェイトハンドルによって使用されるリソースを破棄する必要があります。

ドキュメントから:

WaitHandleクラスの現在のインスタンスによって使用されているすべてのリソースを解放します。(WaitHandleから継承されます。)

ウェイトハンドルは、使用の最後に破棄する必要がある管理されていないリソースを使用します。

MSDNドキュメントMutex

于 2011-08-18T12:08:20.733 に答える