.NET 4.0プロジェクトではTaskScheduler
、同時実行の程度が制限されたカスタムを使用しています(MSDNのLimitedConcurrencyLevelTaskSchedulerの例と同様)。実行する一連のタスクは、他の操作が結果を返すのを待っている間にブロックされ、作業を続行します。この期間中にこのスケジューラーのスレッドが何もすることがないのは残念なので、1つのブロックの間に別のタスクをスケジュールしたいと思います。
TPLは、タスクがブロックされたときにそれを確認して、別のスケジュールを立てることができると思いましたが、実験しMonitor.Wait()
たり、待ったりすると、そうでManualResetEvent
はないことがわかりました。私はすでに自分のタスクスケジューラを使用しているので、別のタスクをスケジュールするように明示的に指示する方法があるかもしれないと思いましたがTask
、TaskScheduler
などでそうする方法が見つかりませんでした。
1つのタスクを実行している最中なので、ここでは継続が機能しないことに注意してください。また、タスクを待機前と待機後の2つに分割することは避けたいと思います。待機が必要なポイントがいくつかある可能性があり、それらをすべて分割すると、元のアルゴリズムの断片化のレベルにつながる可能性があるためです。それは維持するのを難しくするでしょう。Async CTPのようなものawait
が役立つと思いますが、これには.NET4を使い続ける必要があります。
次のタスクをデキューし、タスクが完了したら現在のタスクに戻るようにタスクスケジューラに指示するために、不足しているものはありますか?