PLINQ AsParallel()の一部を実行することは可能ですか?他よりも優先度の低いクエリですか?(または他よりも優先度の高いものもあります)これはPLinqで可能ですか、それともPLINQを避けて、すべてを自分で行う必要がありますか?
編集/更新:
電話をかけることは可能でしょうか
Thread.Sleep(0)
低い優先度をアーカイブしたい場合、並列実行メソッド内で?それとも、それは非常に悪い習慣/ハックですか?
残念ながら、これはPLINQでは直接不可能です。
カスタムTaskSchedulerを作成することにより、残りのほとんどのタスク並列ライブラリでこれを実行できます。Parallel.For
これにより、またはを使用するときにカスタムの「優先度」を設定できますForEach
。
ただし、PLINQにはTaskSchedulerからの非常に厳密な保証が必要であり、これを公開すると非常に問題が発生することが懸念されるため、TaskSchedulerをカスタマイズする機能はPLINQでは提供されませんでした。
編集/更新:
電話をかけることは可能でしょうか
Thread.Sleep(0)
これにより優先度が「低く」なりますが、残念ながら、特にPLINQと組み合わせると、独自の問題が発生します。これにより、ThreadPoolスレッドで「スリープ」状態になるため、ThreadPoolでスレッドが不足する可能性があります。
さらに、これには根本的な問題があります。PLINQはクエリを処理するように設計および意図されており、処理用には設計されていません。フロー構造を制御するための論理コードの導入は、PLINQの背後にある理論に反しており、特にデフォルトのパーティショニングを使用している場合は、予期しないパフォーマンスへの影響を引き起こす可能性があります。
AsParallel
非常に高レベルのAPIです。PriorityThread
を使用して何が起こっているかをきめ細かく制御したい場合は、実際にsを使用する必要があります