2011-01-19 8 views
0

私は、Paraller.ForEach()ループを使用して約7,800のURLをダウンロードして処理するアプリケーションを用意しています。この手法を使用すると、コンピュータが約4.5分でこの操作を完了することができました(平均で約28分かかります)。Parallel.ForEach()....ループを外部で終了するにはどうすればよいですか?

これはWinFormsアプリケーション内で実行されているため、ユーザーはストップボタンをクリックするだけでプロセスを早期に停止することができ、揮発性ブール変数を 'false'に設定します。私のParallel.ForEach()ループの最上部で、その変数の状態をチェックし、 'false'に設定されている場合は単にParallelLoopState.Stop()メソッドを呼び出します。ループ内の次のコードブロックは、ParallelLoopStateが停止していない場合にのみ実行されます。

素晴らしいです。この実装を使用して3週間私はそれを使用してきたゼロ問題を経験したことがあります。

しかし、私は "CancellationTokenSource"と "CancellationToken"クラスを読んでいましたが、これは本質的に同じ動作を実行するように設計されていることを発見しました... Parallelループを外部から取り消すことができます。

私の既存の実装を引き続き使用し続ける問題があると誰に教えてもらえますか?

Parallel.ForEach(searchList, (url, state) => 
{ 
    if (!this.isSearching) 
    { 
     state.Stop(); 

     OnSearchEvent(new SearchStatusEventArgs(SearchState.STOP_REQUESTED, ......)); 
    } 

    if (!state.IsStopped) 
    { 
     // continue on with regular processing ....... 
    } 
}); 
+2

私はYAGNI(あなたはそれを必要としないだろう)の原理は、 "それが壊れていなければ、それを修正しないでください"とアップキャストできると信じています:) –

+0

私はあなたとデイブです。私がParallelエクステンションを初めて使用しているので、私はまだ気付いていない隠れたグレムリンを隠しているものを構築していないようにしたいと思っています。信頼できると思う橋を建てることよりも悪いことはありません。あなたが地雷に代わり立っていることを認識するだけです。 – BonanzaDriver

答えて

2

私によく見えます! CancellationTokenSourceとCancellationTokenは実際にTasksで使用されます。特に、タスクはContinueWithでリンクされています。そこから、トークン(スレッドセーフ)を調べて例外をスローするか、スレッドをで終了させることは全く同じ方法で行います。

複雑なタスクチェインとクロージャのルートを辿ることができない限り、複雑な作業は必要ありません。

+0

私はそれを簡単に保つと信じています。私は新しいテクニックを見つけたことをうれしく思っています。しかし、インプラントが、未知の不思議な問題がなくてもうまくいけば、すべて改善されます。おかげでTom。 – BonanzaDriver

関連する問題