2

.NET 4.0プロジェクトではTaskScheduler、同時実行の程度が制限されたカスタムを使用しています(MSDNのLimitedConcurrencyLevelTask​​Schedulerの例と同様)。実行する一連のタスクは、他の操作が結果を返すのを待っている間にブロックされ、作業を続行します。この期間中にこのスケジューラーのスレッドが何もすることがないのは残念なので、1つのブロックの間に別のタスクをスケジュールしたいと思います。

TPLは、タスクがブロックされたときにそれを確認して、別のスケジュールを立てることができると思いましたが、実験しMonitor.Wait()たり、待ったりすると、そうでManualResetEventはないことがわかりました。私はすでに自分のタスクスケジューラを使用しているので、別のタスクをスケジュールするように明示的に指示する方法があるかもしれないと思いましたがTaskTaskSchedulerなどでそうする方法が見つかりませんでした。

1つのタスクを実行している最中なので、ここでは継続が機能しないことに注意してください。また、タスクを待機前と待機後の2つに分割することは避けたいと思います。待機が必要なポイントがいくつかある可能性があり、それらをすべて分割すると、元のアルゴリズムの断片化のレベルにつながる可能性があるためです。それは維持するのを難しくするでしょう。Async CTPのようなものawaitが役立つと思いますが、これには.NET4を使い続ける必要があります。

次のタスクをデキューし、タスクが完了したら現在のタスクに戻るようにタスクスケジューラに指示するために、不足しているものはありますか?

4

3 に答える 3

2

あなたがあなた自身のものを持っているならTaskScheduler、TPLは何もスケジュールしません、それはの仕事ですTaskScheduler

TaskScheduler別のスケジュールを設定するようにカスタムに指示する方法が必要な場合Taskは、自分でそれを追加する必要がありTaskSchedulerます。また、実行を一時停止する方法がないため、新しいものTaskを実行してから古いものに「戻る」ことはできませんTask

ただし、最も簡単な解決策は、デフォルトを使用することです。これは、スケジュールする秒数を決定するときにTaskSchedulerブロックされた秒を考慮に入れるためです。TaskTask

于 2012-06-01T17:28:05.917 に答える
0

Task.ContinueWithは、最初のタスクが完了または障害が発生したときにタスクをスケジュールするオプションを提供します。ただし、これは、最初のタスクが完了まで実行された場合にのみ役立ちます。

于 2012-06-01T15:24:19.913 に答える
0

そのようなものは組み込まれていません。このような問題を回避するには、非ブロッキングタスクを使用します。

また、独自のカスタムTaskSchedulerを作成して、CPUの数よりも多くのスレッドを並列に実行することにより、CPUをわずかにオーバーサブスクライブすることもできます。これはわずかな非効率につながりますが、タスクがブロックされた場合、他の「埋め戻し」タスクがすでに実行されており、CPUを引き継いでいます。

于 2012-06-01T15:40:51.833 に答える