gpt4 book ai didi

c# - 从父子任务返回值

转载 作者:太空狗 更新时间:2023-10-29 20:31:00 27 4
gpt4 key购买 nike

在下面的代码片段中,一个任务使用 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.

最佳答案

问题是您将 c1c2 创建为单独的任务,但随后立即从 t1 返回 ic1c2 递增 i 之前。

因此,t1 的返回值在该点被捕获,并且仍然是 100

如您所述,这种安排在 parent /子女关系中没有多大意义;但在很多情况下它确实有意义。

一个常见的用法是让父任务在它的子任务完成之前不完成,但是如果你要求父任务在返回一个值之前等待它的子任务,你将无法这样做.

当然,你可以通过添加来修复它

Task.WaitAll(c1, c2);

就在 return i; 之前。我知道这不是您要问的,但无论如何我只是想指出这一点。

关于c# - 从父子任务返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16770833/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com