C# 父任务不等待子任务完成

C# 父任务不等待子任务完成,c#,.net,task-parallel-library,C#,.net,Task Parallel Library,这是我的代码 Task<int[]> parent = Task.Run(() => { var result = new int[3]; TaskFactory tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously); for (int i = 0; i < result.Length; i

这是我的代码

Task<int[]> parent = Task.Run(() =>
{
    var result = new int[3];

    TaskFactory tf = new TaskFactory(TaskCreationOptions.AttachedToParent, TaskContinuationOptions.ExecuteSynchronously);

    for (int i = 0; i < result.Length; i++)
    {
        int j = i;
        tf.StartNew(() => result[j] = GetRandomNumber(j));
    }

    return result;
});

var finalTask = parent.ContinueWith(parentTask =>
{
    foreach (var i in parentTask.Result)
    {
        Console.WriteLine(i);   
    }
});

finalTask.Wait();
这段代码做同样的事情

Task<int[]> parent = Task.Run(() =>
{
    var result = new int[3];

    for (int i = 0; i < result.Length; i++)
    {
        int j = i;
        new Task(() => result[j] = GetRandomNumber(j), TaskCreationOptions.AttachedToParent).Start();
    }

    return result;
});
Task parent=Task.Run(()=>
{
var结果=新整数[3];
for(int i=0;iresult[j]=GetRandomNumber(j),TaskCreationOptions.AttachedToParent.Start();
}
返回结果;
});
在的文档中,您会发现它指定了

其CreationOptions属性值为TaskCreationOptions.denychildatach


因此,即使您指定了
TaskCreationOptions.AttachedToParent
,它也会被忽略。

此行为是由于您使用了该方法,该方法禁止将子任务附加到父任务:

Run
方法是该方法更简单的替代方法。它创建一个属性值为的任务

要解决此问题,只需将第一行更改为

Task<int[]> parent = Task.Run(() =>
Task parent=Task.Run(()=>

Task parent=Task.Factory.StartNew(()=>

请使用以下代码:

static void RunParentTask()
    {
        Task<int[]> parent = Task.Factory.StartNew<int[]>(() =>
        {
            var results = new int[3];

            TaskFactory<int> factory = new TaskFactory<int>(TaskCreationOptions.AttachedToParent,
                                                            TaskContinuationOptions.ExecuteSynchronously);
            factory.StartNew(() => results[0] = 1);
            factory.StartNew(() => results[1] = 2);
            factory.StartNew(() => results[2] = 3);

            return results;
        });

        parent.Wait();

        foreach (var item in parent.Result)
        {
            Console.WriteLine(item);
        }
    }
static void RunParentTask()
{
任务父级=任务.Factory.StartNew(()=>
{
var结果=新整数[3];
TaskFactory工厂=新的TaskFactory(TaskCreationOptions.AttachedToParent,
TaskContinuationOptions.ExecuteSynchronously);
factory.StartNew(()=>结果[0]=1);
factory.StartNew(()=>结果[1]=2);
factory.StartNew(()=>结果[2]=3);
返回结果;
});
parent.Wait();
foreach(parent.Result中的var项)
{
控制台写入线(项目);
}
}

这只是一个示例。逐步浏览代码,看看它在做什么。GetRandomNumber被点击了3次,但方法的结尾是never hitI。我正要发布这篇文章,这篇文章可能会让相同的人:
Task<int[]> parent = Task.Factory.StartNew(() =>
static void RunParentTask()
    {
        Task<int[]> parent = Task.Factory.StartNew<int[]>(() =>
        {
            var results = new int[3];

            TaskFactory<int> factory = new TaskFactory<int>(TaskCreationOptions.AttachedToParent,
                                                            TaskContinuationOptions.ExecuteSynchronously);
            factory.StartNew(() => results[0] = 1);
            factory.StartNew(() => results[1] = 2);
            factory.StartNew(() => results[2] = 3);

            return results;
        });

        parent.Wait();

        foreach (var item in parent.Result)
        {
            Console.WriteLine(item);
        }
    }