2009-07-28 5 views
4

私は10スレッドを開始するアプリがあります。 各スレッドは作業を行い、プロデューサコンシューマモデルを使用して待機します。 それでは、もっと多くの作業が行われると、スレッドの1つがブロック解除され、作業が行われます。スレッドが死んだり、凍結した場合のコード作成はできますか?

仕事中の同僚は、「ただの場合」のスレッドを監視するコードを記述する必要があると主張しています。

これまでのテストでは正常に動作して正常に終了しました。

私の質問は「これを行うにはコードを入れるべきか」です。もしそうなら、「スレッドを監視してその状態を確認するにはどうしたらいいですか?

ありがとうございました。 JD

+4

どのスレッドで監視を計画していますか?それが "凍結して死ぬ"場合はどうなりますか? –

+0

各スレッドには、データベース内のレコードに対応するジョブが与えられます。スレッドが機能すると、レコードが更新されます。スレッドがフリーズまたは消滅した場合、最後の更新から約10分が経過すると、別のスレッドがレコードをクリアし、別のスレッドがそのスレッドを使用できるようにします。 あなたの質問については、メインスレッドから新しいスレッドを起動することを考えていましたが、それは監視を行います(ただし、この段階では何​​も決定されていません)。 私の他の問題は、スレッドがフリーズする場合、私は新しいスレッドを開始する必要があります。どうすればいい? –

+0

あなたのデザインを考え直したいかもしれません.... DBレコードごとに1つのスレッド??????!?!? – Janie

答えて

5

本当に状況によって異なります。まず、凍結や死ぬことがないように正確性に焦点を当てるべきですが、より信頼性が必要な場合は、まずそのような状況から正常に回復する方法について考える必要があります。なぜそれが凍結するか死ぬか、もしそうであればあなたができることを考えなければなりません。あなたがそのような状況から確実に回復する良いことをすることができないなら、あなたは試してはいけません。状況を悪化させることなくそれを行うことができれば、行くことができます。

このような選択をした場合は、物事を混乱させないように注意し、実際に悪いことを起こすようなバグを導入する必要があります。

4

理想的には、スレッドは正常に終了する必要があります。それらを監視することは、複雑さと処理時間の価値がありません。正しく操作すると、監視は必要ありません。

+0

ありがとうございます。これまでのところ、すべてが正常に動作しているように見え、スレッドが瀕死または凍結しても問題はありません。私はアプリケーションを閉じると正しく閉じます。 –

-1

スレッドを強制的に再起動したとしても、スレッドがハングアップするか死ぬかを常にコード化する必要があります。

+2

いつも!また、あなたがいる間に 'Debug.Assert(true!= false)'ステートメントをいくつか含めることができます:P – Thorarin

+0

私はThorarinに同意します。私の答えを見てください。 –

2

.NET Framework 2以上をコーディングしていると仮定すると、ワーカースレッドで処理されない例外がアプリケーション全体を強制終了します。

スレッドコードが例外をスローしたり、メモリを予約したり、ハンドルを取得したり、フレームワークコードを呼び出すことが絶対に確実でない限り、最初にやりたいことはありませんあなたのスレッドのエントリメソッドの書き込みはtry/catchです。

+0

エンタープライズログを使用してログファイルに書き込むtry/catchがあります。だからこそ、それはいいです。 –

2

あなたのスレッドが仕事を待つのに多くの時間を費やしている場合は、System.Threading.ThreadPoolクラスを使用するようにアプリケーションをリファクタリングすることを検討できます。そうすることで、スレッド管理の多くがフレームワークに負荷がかかります。

1

スレッドは、ユーザーコードにバグがない限り、ハングしたり、死ぬだけではありません。 OS /フレームワークの失敗の可能性はごくわずかなので、実際的な目的では不可能です。これは、File.WriteAllBytes()が成功したとしても、ハードディスクにファイルを書き込まないという心配のようなものです。それだけでは起こりません。

つまり、wildcardは、ワーカースレッドの未処理の例外が、AppDomain全体で未処理の例外としてポピュレートするという良い点をもたらします。

0

「ThreadPool」を使用してThreadPool.QueueUserWorkItemを呼び出し、.NetでThreadPoolを非常に効率的に管理します。

あなたは割り当てるスレッドの最大数を設定することができますし、あなたはまた、WaitHandleが完了した時点で待機するように取得することができます任意の待機操作などを行う必要がいけません。スレッドのブロック/ブロック解除を管理する必要はありません。

関連する問題