LongRunningオプションを使用してタスクを作成した場合、ThreadPoolを使用しないため、副作用はありません。
はい。副作用はそれです:あなたが百万のタスクを持っているなら、あなたは潜在的に百万のスレッドを作成することができます。
各スレッドがそれをもたらすことを考慮する必要がありますメモリオーバーヘッドそしてコンテキストスイッチングのオーバーヘッドメモリのオーバーヘッドはそれほど小さくない、我々が話している数MBここで何千ものアイテムがあっても、あなたは問題にぶつかることができます。
のLongRunning
オプションはそれを意味するスケジューラへのヒントですよろしく実行することを選択Task
ThreadPool以外のスレッド(スレッドプールの場合)DefaultScheduler
それはおそらくそうなるでしょう)。の1つの副作用LongRunning
オプションは、タスクのインライン化がそのタスクに対して許可されていないことです。これは、LongRunning
タスクは他のネストまたは子タスクと呼び出しを作成します。Wait
これらのタスクのいずれかでは、インライン化されるのではなく、常に異なるスレッドで実行されます(つまり、同じスレッドで実行されます)。Wait
)
他の人々の答えとの関連では、完了するまでに長い時間がかかる多数のタスクを作成することは注目に値します。なしでのLongRunning
それでも、スレッドインジェクションアルゴリズムにより、スレッド数が増加する可能性があります。DefaultScheduler
を使用します。アルゴリズムはプール内のブロックされたスレッドと長い間作業項目を実行していたスレッドを区別しません。どちらの場合も、より多くのスレッドをプールに注入して作業スループットを向上させることで対応できます。
LongRunningタスクは、ローカルキュー内の次のスレッドをブロックしないようにするために、グローバルキューとローカルキューがバイパスされることを示します。
つまり、これらの長期実行タスクがたくさんある場合は、通常よりも多くのスレッドが作成される可能性があります。
あなたはこの質問の答えにいくつかの欠点を見ることができます: