私はあなたが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 });
あなたはforeachのブロック内のタスクを待つとhttpsに示されているようWhenAnyでタスクを待つことができます://のstackoverflowを。 com/questions/4238345 /非同期的にwaitt-for-taskt-to-complete-with-timeoutを実行します。 – blit
「ファイルをスキップして次のファイルに移動したい」 - この文は混乱します。 'Parallel.ForEach'はパラレルでリスト内のすべてのファイルを処理しています。一度に1つではありません。特定のファイルの処理を停止するだけなら、それだけで済みます。他の人たちは同時に続けるでしょう。 –