2012-03-16 4 views
1

私の方法では、複数のスレッドを開始し、作業が終了するまで待機します(fork-joinパターンのようなもの)。複数のスレッドからの集約と転送の例外

using (var countdownEvent = new CountdownEvent(runningThreadsCount)) 
{ 
    for (int i = 0; i < threadsCount; i++) 
    { 
     var thread = new Thread(new ThreadStart(delegate 
               { 
                // Do something 
                countdownEvent.Signal(); 
               })); 

     thread.Start(); 
    } 

    countdownEvent.Wait(); 
} 

今、私はこのスレッドで例外をキャッチできるようにする必要があり、メインスレッドに例外を渡し、(それはcountdownEventに待っているので)、それをブロック解除(// Do somethingが例外をスローすることがあることを前提とします)と再例外をスローします。

それを達成するための最もエレガントな方法は何ですか?

+1

.net 4にアクセスできますか?タスクAPIは既に集約例外を知っています... – flq

+0

はい、私は.netへのアクセス権を持っています4 – levanovd

答えて

1

Tasks APIと私の問題を解決しました。ありがとうflqの提案!

var cancellationTokenSource = new CancellationTokenSource(); 
var tasks = new Task[threadsCount] 
for (int i = 0; i < threadsCount; i++) 
{ 
    tasks[i] = Task.Factory.StartNew(
     delegate 
      { 
       // Do something 
      }, cancellationTokenSource.Token); 
} 

try 
{ 
    Task.WaitAll(tasks); 
} 
catch (AggregateException ae) 
{ 
    cancellationTokenSource.Cancel(); 
    throw ae.InnerExceptions[0]; 
} 
関連する問題