2012-02-27 16 views
13

私は、Task Parallel Libraryを使用して実装した長年のタスクを持っています。タスクが開始されると、いくつかの入力値とコレクションのスナップショットを取得し、その情報を使用してさまざまな操作を実行します。タスクの実行中にこれらの値またはコレクションのいずれかが変更された場合、タスクが完了したら直ちに再度実行するようにしたいと思います。新しいタスクを作成するか、既存のタスクを再利用する方法はありますか? 2番目の反復を開始する最善の方法は何ですか?繰り返しタスクを再起動/再利用するにはどうすればよいですか?

答えて

11

新しいタスクを作成します。

http://msdn.microsoft.com/en-us/library/dd270682.aspxは、実行中のタスクまたは完了したタスクの再試行がサポートされていないことを示しています。通常は例外をスローする何かを行うことはめったにありません。また、タスクを再利用することもその1つです。

+0

2番目のタスクの必要性をどのように伝えますか?元のタスクが実行されている間に、完了した後のいつかまで変更が発生する可能性があります。 – SonOfPirate

+0

その基準に基づいて、現在の状態をポーリングする1つの非終了タスクでうまくいくと思います。状態が変わったら、あなたのことをしてください。ここでの基本的な要件は、これが非同期的に発生し、メインスレッドをブロックしないようにすることです。タスクに、アプリケーションが終了して終了することを示すフラグを設定する必要があります。 –

+0

私は何も考えていない単一のタスクを終了します。私はCancellationTokenを使用して、アプリケーションが終了したときに処理することができますが、アルゴリズムを実行するためにTaskが必要であることを示すためにどのようなメカニズムを使用するべきかわかりません。 AutoResetEventを使用すると、タスクのスレッドがイベント待ちの状態で中断されるため、キャンセルできなくなります。一方、私はSpinWaitを使用することはCPUを大量に消費することを読んでいます。 – SonOfPirate

1

もう一度既存のTaskを開始することはできません。したがって、2つのオプションがあります。

  1. Taskを新規作成してください。これはおそらくよりクリーンです。
  2. Taskのループを実行して、前回以降何かが変更されたかどうかを確認します。変更した場合は、新しい繰り返しを開始します。
+0

上記と同じ質問:2番目のタスクの必要性をどのように伝えますか? – SonOfPirate

+0

2番目のタスクが必要であるとどのように判断するのか分からずに伝えるのは難しいです。完了後も再起動したい場合は、イベントを使用することができます。 – svick

0

また、(VB.NETまたは代表者)関数ポインタを使用するようにプログラムロジックをリファクタリングできます。

関連する問題