統合テストの中には、複数のスレッドを開始し、統合テストが終了したとき(失敗した場合でも)スレッドがクリーンアップされるようにしたい。誰もこれを行うエレガントな方法をお勧めできますか?C#の統合テストの後にすべてのスレッドが停止していることを確認
おかげ
EDIT:みんなの答えてくれてありがとう - テストのスレッドが停止し、テスト中に他のスレッドのいくつかはQTAgent(テストプロセスを)持っていないときだけ明確にする「クリーンアップは」に言及していましたエラーを出していました。
統合テストの中には、複数のスレッドを開始し、統合テストが終了したとき(失敗した場合でも)スレッドがクリーンアップされるようにしたい。誰もこれを行うエレガントな方法をお勧めできますか?C#の統合テストの後にすべてのスレッドが停止していることを確認
おかげ
EDIT:みんなの答えてくれてありがとう - テストのスレッドが停止し、テスト中に他のスレッドのいくつかはQTAgent(テストプロセスを)持っていないときだけ明確にする「クリーンアップは」に言及していましたエラーを出していました。
Thread.Join()
を作成スレッドごとThread
オブジェクトを保持していることを確認します。いずれかのスレッドがすばやく終了しない場合は、テストが失敗してもテストが失敗するはずです。アプリケーションとテストのアーキテクチャについて詳しく知ることなく、これを詳しく説明することは不可能です。
タスクをC#4で使用し、キャンセルトークンを使用したり、スレッドの終了を処理することができます。 http://msdn.microsoft.com/en-us/library/dd460717.aspx
.Net 4.0を使用していて、起動するスレッドの数がわかっている場合は、CountdownEventを使用できます。次に、各スレッドでtry/finallyブロックを使用してイベントを設定します。クリーンアップコードで、イベントを待ちます。必要に応じてタイムアウトを追加し、それを使用してエラー状態を示すことができます。
Thread.Join()
を使用すると、呼び出し元のスレッドが終了するまで現在のスレッドがブロックされます。参加する前に、状況に応じてさまざまな方法で終了するように他のスレッドに通知することができます。
Thread.Abort()
を呼び出すと、ターゲットスレッドでアボート例外が発生します。これを防ぐために明示的に何かを行わない限り、通常は停止されます。アボートはちょうどエレガントではありませんが。
テストスレッドでThread.IsBackground
をtrueに設定すると、メインスレッドが終了してもプロセスが実行されないことがあります。プロセスが終了すると、あなたのバックグラウンドスレッドが自動的に世話をします。個人的に
、私のテストのスレッドのほとんどは、以下のパターンになりがち:
private static readonly ManualResetEvent m_ThreadsShouldExit = new ManualResetEvent(false);
private static void SomeThreadBody()
{
while(!m_ThreadsShouldExit.WaitOne(0))
{
DoSomething();
}
}
あなたは、「クリーンアップ」によって何を意味するか説明してもらえます。スレッドが作業を終了したり例外をスローしたりすると、明示的な介入なしに気化します(スレッドプールスレッドで、プールに戻っていない場合を除く)。 –