2011-08-18 13 views
10

私はシステムミューテックスでロック(クロスプロセス)したい共通データベースを持つ2つのWindowsサービスに取り組んでいます。 ミューテックスを処分すべきですか?

は、今私は(例えば usingブロックで)それだけで try-finallyブロックに WaitOne()ReleaseMutex()を呼び出すために大丈夫ですか、私はまた、ミューテックスを配置すべきかどうか迷っています。もしそうなら、私はいつもを WaitOne()メソッドでキャッチすべきか、ここで間違っていますか?

+0

mutexを所有するサービスが予期せず終了したことを通知するには、AbandonedMutexExceptionが必要です。その場合は、dbaseの使用をやめ、他のサービスが再び起動するまで待ちます。3番目のプロセスを使用してアービタとして行動することは賢明です。 –

答えて

12

ミューテックスは、(ここでは.NETオブジェクトに包まれた)Windowsカーネルオブジェクトです。

このように、管理対象ではないリソースであり、廃棄する必要があります。

より正確には、.NETオブジェクトにはミューテックスに対するハンドルが含まれています。ミューテックスは、何らかの形でリリース/廃棄する必要があります。

mutexオブジェクトが配置されていないcode sample in the Mutex class docsは信用できません。 Henziはコメントに優れていますが、Mutexオブジェクトは静的であり、プロセスが終了するとファイナライザによって破棄されるか、Windowsカーネルによって破棄されます。

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

もちろん、あなたがそれを使用していない間でも、既存のMutexオブジェクトをあなたのアプリケーションに保持することには何も問題ありません。彼らは軽い資源です。

+0

コードサンプルが残っていないので、リンクする必要があります。http://msdn.microsoft.com/en-us/library/system.threading.mutex.aspx –

+1

done。次回は、私の答えを編集してください;-) –

+0

しかし、私はWindowsサービスを作成しているので、私は自分のサービス(いつでも)の「ランタイム」中に処分することを嫌うべきではないと思います。同じ名前の新しいMutexインスタンスを作成するたびに、同じ管理されていないインスタンスがラップされます。それとも、新しい管理されていないリソースを繰り返し作成するのだろうか?おそらく私のサービスの一つが本当にそれをきれいにするために停止したときにミューテックスを閉じることができましたか? – Koen

2

waithandleで使用されているリソースを処分する必要があります。

リリースWaitHandle クラスの現在のインスタンスによって使用されているすべてのリソース:ドキュメントから

。 (WaitHandleから継承されます。)

waithandleは、使用終了時に廃棄する必要がある管理されていないリソースを使用します。

MSDN Documentation Mutex

6

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

非管理面ではMSDNは

がハンドルを閉じるためにCloseHandle機能を使用してくださいと言います。プロセスが終了すると、システムは自動的にハンドルを閉じます。 mutexオブジェクトは、最後のハンドルが閉じられたときに破棄されます。 .NETで

あなたはMutex.Close()を呼び出す必要がありますが - Close()ウォン」を呼び出していない...でも、同じ名前のMutexこれは一貫した練習にアクセスするとき、すべてのプロセスがHANDLE独自のを取得しますので、これは... HANDLEをリリースプロセスがもう終了しなくなったら問題は残しておきます(ファイナライザとすべて)...

関連する問題