以下のスニペットでは、タスクは 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.