the*_*guy 7 c# task-parallel-library
在下面的代码段中,任务使用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.");
}
Run Code Online (Sandbox Code Playgroud)
输出:
Main start.
Calling Result.
In parent start
In parent end
In child 1:101
In child 2:102
100
Main end.
Run Code Online (Sandbox Code Playgroud)
问题是你创建c1和c2作为单独的任务,但然后i立即从t1之前返回c1并c2增加i.
因此,t1在该点捕获返回值,并且仍然是100.
正如您所指出的那样,这种安排的父母/子女关系没有太大意义; 但是有很多情况确实有意义.
常见的用途是父任务在子任务完成之前不会完成,但如果您要求父任务在返回值之前等待其子任务,则您将无法像这样执行.
当然,您可以通过添加来修复它
Task.WaitAll(c1, c2);
Run Code Online (Sandbox Code Playgroud)
就在之前return i;.我知道这不是你问的问题,但我还是想指出这一点.
| 归档时间: |
|
| 查看次数: |
574 次 |
| 最近记录: |