TPL のネストされたタスクの概念を理解しようとしています。ネストされたタスクの場合、親から完全に独立しているため、2 つの個別のタスクを作成するのではなく、ネストされたタスクを作成する方がよい条件は何ですか。
親タスクのローカル キューを使用すると、パフォーマンスが向上しますか?
TPL のネストされたタスクの概念を理解しようとしています。ネストされたタスクの場合、親から完全に独立しているため、2 つの個別のタスクを作成するのではなく、ネストされたタスクを作成する方がよい条件は何ですか。
親タスクのローカル キューを使用すると、パフォーマンスが向上しますか?
これに関するmsdnのドキュメントは次のとおりです。
まず、「ネストされたタスク」とは、次のように、別のタスク内で新しいタスクを開始することを意味します。
var outerTask = Task.Factory.StartNew( () =>
{
var nestedTask = Task.Factory.StartNew( () =>
{
Console.WriteLine("Inside nestedTask");
});
});
あなたがおそらく意味していたのは、「ネストされたタスク」と「子タスク」の違いは何ですか
「子タスク」は次のようになります。
var parentTask = Task.Factory.StartNew( () =>
{
var childTask = Task.Factory.StartNew( () =>
{
Console.WriteLine("Inside childTask");
}, TaskCreationOptions.AttachedToParent );
});
子タスクは、親タスクとの特定の同期を強制します。
子タスクは、独立したネストされたタスクよりも常に同期オーバーヘッドが高くなるため、なぜそれらを使用する必要があるのか 疑問に思うでしょう。
これらのタスクの同期を確実にしたい場合があります。親タスクが完了する前に、childTask で何かを計算する必要があります。それ以外の場合は、非決定性に対処する必要が少し少なくなるため、デバッグが容易になる場合があります。
非決定性が少ないため、コードの記述とテストをより迅速に行うことができます。
このように実装されているかどうかはわかりませんが、特に親が単に子タスクを待っている場合に、子タスクが親と同じスレッド/コアに挿入される可能性があります。この場合、子タスクの親タスクからキャッシングの追加の利点を得ることができる場合があります。
(いいアイデアのように思えますが、まだそのように実装されているとは思いません。間違っていたら訂正してください)。