以下のスニペットでは、TaskCreationOptions.AttachedToParentを使用して2つの子タスクを作成します。つまり、親タスクは子タスクが完了するまで待機します。親子タスクからの戻り値
質問です - なぜ親タスクは正しい値[102]を返しませんか?最初に戻り値を決定してから、子タスクが完了するまで待機します。そうであれば、親子関係の作成のポイントは何ですか?
void Main()
{
Console.WriteLine ("Main start.");
int i = 100;
Task<int> t1 = new Task<int>(()=>
{
Console.WriteLine ("In parent start");
Task c1 = Task.Factory.StartNew(() => {
Thread.Sleep(1000);
Interlocked.Increment(ref i);
Console.WriteLine ("In child 1:" + i);
}, TaskCreationOptions.AttachedToParent);
Task c2 = Task.Factory.StartNew(() => {
Thread.Sleep(2000);
Interlocked.Increment(ref i);
Console.WriteLine ("In child 2:" + i);
}, TaskCreationOptions.AttachedToParent);
Console.WriteLine ("In parent end");
return i;
});
t1.Start();
Console.WriteLine ("Calling Result.");
Console.WriteLine (t1.Result);
Console.WriteLine ("Main end.");
}
出力:
Main start.
Calling Result.
In parent start
In parent end
In child 1:101
In child 2:102
100
Main end.
はい待機値と戻り値は異なるものですが、戻り値を決定する前に待機しないようにしてください。これがTPLのバグかもしれないと思いますか? – thewpfguy
@thewpfguyいいえ、間違いなくバグではありません。最初のタスクを開始したタスクが最初のタスクの戻り値にアクセスする前に終了した場合、タスクの結果がキャッシュされるのは当然の結果です。 –