2011-10-23 9 views
2

ワーカースレッドのメソッドで、Mutexという名前のアクセスが集中するように、Windowsサービスをリファクタリングしています。 OnStop()~DerivedService()でリリースする代わりに、finallyブロックでリリースする必要があります。私はShiftキー+ F5デバッグを停止して、それを期待すると(例外を丁寧よりも深刻)のクラッシュを打ったとき、私はデストラクタ呼び出しのスキップを観察してきました「最終的に」コードブロックがスキップされる理由は何ですか?

はfinallyブロックスキップするだけの理由だろう。私は、私は、サービスコードを交換するrigmorale前に、ここで任意の厄介な驚きを片付けることを望んでログインしてたサービスそのワーカースレッドをコーディングデバッガを添付していますなどとして

感謝。

答えて

2

Windowsミューテックスには、ミューテックスを解放せずにプログラムやスレッドが予期せず終了した状況を処理する組み込みのメカニズムがあります。現在mutexを保持しているスレッドが終了した場合、mutexは自動的にロック解除されますが、が放棄された状態になります。

クリーンアップに集中するのではなく、ミューテックスが取得され、その状態が放棄されるたびに特別なルーチンを作成します。そのような場合は、保護されたリソースの一貫性チェックを追加する必要があります。

+0

場合は一般的に、私はに非常に新しいですWindowsスレッドとプロジェクトとデータはそれほど複雑ではありません。私はちょうどunsync'edブロックからのsync'ingに関するエラーは、スレッドローカル(MSDNのように)ミューテックスロックの性質を参照して、実際には私のためのより良い場所を探していることに気づいたクリーンアップコード。サービスで爆発する可能性のあるすべての出来事を完全に理解したことはありませんでした。 – John

+0

私は 'AbandonedMutexExceptions'を期待していましたが、私がその中に入ったとき、私が言及したエラーの「同期していないブロックから同期しています」というエラーが発生しました。 – John

1

最終ブロックが実行されない理由は、実際には数多くあります。あなたはDoes the C# "finally" block ALWAYS execute?ここで例えばEnvironment.FailFast、いくつかの非同期例外(StackOverflowExceptionExecutingEngineException)、激しくお使いのPCの:-)をシャットダウンし、(しばしば忘れ)if there is an exception in a finalizer method

Readを呼び出し、In C# will the Finally block be executed in a try, catch, finally if an unhandled exception is thrown?

関連する問題