21

LongRunningオプションを使用してタスクを作成した場合、ThreadPoolを使用しないため、副作用はありません。


3 답변


16

はい。副作用はそれです:あなたが百万のタスクを持っているなら、あなたは潜在的に百万のスレッドを作成することができます。

各スレッドがそれをもたらすことを考慮する必要がありますメモリオーバーヘッドそしてコンテキストスイッチングのオーバーヘッドメモリのオーバーヘッドはそれほど小さくない、我々が話している数MBここで何千ものアイテムがあっても、あなたは問題にぶつかることができます。


26

LongRunningオプションはそれを意味するスケジューラへのヒントですよろしく実行することを選択TaskThreadPool以外のスレッド(スレッドプールの場合)DefaultSchedulerそれはおそらくそうなるでしょう)。の1つの副作用LongRunningオプションは、タスクのインライン化がそのタスクに対して許可されていないことです。これは、LongRunningタスクは他のネストまたは子タスクと呼び出しを作成します。Waitこれらのタスクのいずれかでは、インライン化されるのではなく、常に異なるスレッドで実行されます(つまり、同じスレッドで実行されます)。Wait

他の人々の答えとの関連では、完了するまでに長い時間がかかる多数のタスクを作成することは注目に値します。なしでLongRunningそれでも、スレッドインジェクションアルゴリズムにより、スレッド数が増加する可能性があります。DefaultSchedulerを使用します。アルゴリズムはプール内のブロックされたスレッドと長い間作業項目を実行していたスレッドを区別しません。どちらの場合も、より多くのスレッドをプールに注入して作業スループットを向上させることで対応できます。


  • リフレクティングは、.NET 4.0以降のヒントが常に守られていることを示しています。 - usr

5

LongRunningタスクは、ローカルキュー内の次のスレッドをブロックしないようにするために、グローバルキューとローカルキューがバイパスされることを示します。

つまり、これらの長期実行タスクがたくさんある場合は、通常よりも多くのスレッドが作成される可能性があります。

あなたはこの質問の答えにいくつかの欠点を見ることができます:

http://social.msdn.microsoft.com/Forums/en/parallelextensions/thread/8304b44f-0480-488c-93a4-ec419327183b


  • もう少し明確にするために更新されました(そしてうまくいけば、MSDNが言っていることとよりインラインになります)。 - Holger

リンクされた質問


関連する質問

最近の質問