2011-07-27 4 views
2

統合テストの中には、複数のスレッドを開始し、統合テストが終了したとき(失敗した場合でも)スレッドがクリーンアップされるようにしたい。誰もこれを行うエレガントな方法をお勧めできますか?C#の統合テストの後にすべてのスレッドが停止していることを確認

おかげ

EDIT:みんなの答えてくれてありがとう - テストのスレッドが停止し、テスト中に他のスレッドのいくつかはQTAgent(テストプロセスを)持っていないときだけ明確にする「クリーンアップは」に言及していましたエラーを出していました。

+0

あなたは、「クリーンアップ」によって何を意味するか説明してもらえます。スレッドが作業を終了したり例外をスローしたりすると、明示的な介入なしに気化します(スレッドプールスレッドで、プールに戻っていない場合を除く)。 –

答えて

5
  1. あなたは適切な終結シグナルを設定した後、試験終了時に、それらのすべての
  2. コールThread.Join()を作成スレッドごとThreadオブジェクトを保持していることを確認します。いずれかのスレッドがすばやく終了しない場合は、テストが失敗してもテストが失敗するはずです。

アプリケーションとテストのアーキテクチャについて詳しく知ることなく、これを詳しく説明することは不可能です。

3

.Net 4.0を使用していて、起動するスレッドの数がわかっている場合は、CountdownEventを使用できます。次に、各スレッドでtry/finallyブロックを使用してイベントを設定します。クリーンアップコードで、イベントを待ちます。必要に応じてタイムアウトを追加し、それを使用してエラー状態を示すことができます。

1

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(); 
    } 
} 
関連する問題