在下面的代码片段中,任务使用TaskCreationOptions.AttachedToParent创建两个子任务,这意味着父任务将等待子任务完成。从父子任务返回值
问题是 - 为什么父任务没有返回正确的值[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不,它绝对不是一个错误。这是事实的一个自然结果,如果任务的结果在启动第一个任务的任务访问第一个任务的返回值之前退出,则结果将被缓存。 –