0

ファイルを処理し、各ファイルに対して何らかの操作を並列に行うParallel.Foreachのコードがあります。Parallel.Foreach内のスレッドが時間をチェックし、時間がかかっている場合は終了します。

Parallel.ForEach(lstFiles, file=> 
{ 
// Doing some operation on file 
// Skip file and move to next if it is taking too long 
}); 

私は、ファイルをスキップして、次のファイルにを移動する(ただし、Parallel.Foreachを終了したくない)特定のファイルが長すぎます(たとえば2分)取っている場合。 Parallel.Foreachにスレッドが単一ファイルを処理するのにかかる時間をチェックする方法はありますか?

おかげ

+0

あなたはforeachのブロック内のタスクを待つとhttpsに示されているようWhenAnyでタスクを待つことができます://のstackoverflowを。 com/questions/4238345 /非同期的にwaitt-for-taskt-to-complete-with-timeoutを実行します。 – blit

+2

「ファイルをスキップして次のファイルに移動したい」 - この文は混乱します。 'Parallel.ForEach'はパラレルでリスト内のすべてのファイルを処理しています。一度に1つではありません。特定のファイルの処理を停止するだけなら、それだけで済みます。他の人たちは同時に続けるでしょう。 –

答えて

1

私はあなたがParallel.ForEachを使用し、代わりにMirosoftの非常に、より強力な反応性フレームワークを使用しないことをお勧めしたいです。次に、これを行うことができます:

var query = 
    from file in lstFiles.ToObservable() 
    from result in Observable.Amb(
     Observable.Start(() => SomeOperation(file)).Select(_ => true), 
     Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false)) 
    select new { file, result }; 

IDisposable subscription = 
    query 
     .Subscribe(x => 
     { 
      /* do something with each `new { file, result }` 
       as they arrive. */ 
     }, ex => 
     { 
      /* do something if an error is encountered */ 
      /* (stops processing on first error) */ 
     },() => 
     { 
      /* do something if they have all finished successfully */ 
     }) 

これはすべて並行して行われます。 Observable.Amb演算子は、引数リストに定義されている2つのオブザーバブルを開始し、そのうちの2つの値のうち最初に値を生成する値を取る。Startがファイルを処理している場合、Timerが観測可能な場合は2.0分ファイルからの結果。

途中で処理を停止したい場合は、subscription.Dispose()に電話してください。

NuGet "System.Reactive"を使用してビットを取得します。

コメントで要求ごとのように

ラムダ形式でクエリ:

var query = 
    lstFiles 
     .ToObservable() 
     .SelectMany(
      file => 
       Observable.Amb(
        Observable.Start(() => SomeOperation(file)).Select(_ => true), 
        Observable.Timer(TimeSpan.FromMinutes(2.0)).Select(_ => false)), 
      (file, result) => new { file, result }); 
+0

LambdaフォームのlstFiles.ToObservable()のファイルからvarq = というlinqクエリを追加することもできますか? – Gerry

+0

@Gerry - 私はクエリのラムダフォームを追加しました。 – Enigmativity

+0

ありがとうございました@Enigmativity。 – Gerry

関連する問題