c# - 为什么子任务不会在 .ContinueWith 之前完成?

标签 c# task parent-child

据我了解,ContinueWith 方法会等待相关任务完成。在以下代码的情况下,这意味着它在完成其子任务后就完成了。如果这是真的为什么它有时会输出 0 0 0 而其他时间 0 1 2?

    static void Main(string[] args)
    {

        Task<Int32[]> parent = Task.Run(() =>
            {
                var results = new Int32[3];
                new Task(() => results[0] = 0, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[1] = 1, TaskCreationOptions.AttachedToParent).Start();
                new Task(() => results[2] = 2, TaskCreationOptions.AttachedToParent).Start();

                return results;
            });

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

        finalTask.Wait();

        Console.ReadLine();

    }

最佳答案

来自http://blogs.msdn.com/b/pfxteam/archive/2011/10/24/10229468.aspx

When you pass an Action to Task.Run:

Task.Run(someAction);

that’s exactly equivalent to:

Task.Factory.StartNew(someAction, CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default);

在我看来,这会阻止 children 按预期附着。

确实将起始行更改为

Task<Int32[]> parent = Task.Factory.StartNew(() =>

似乎确实解决了这个问题。我通过观察他们在 http://msdn.microsoft.com/en-us/library/dd997417(v=vs.110).aspx 上的不同做法得出了这个结论。它使用 Factory.StartNew 方法而不是 Run

话虽如此,我不确定为什么当您尝试附加任务时它没有抛出 InvalidOperationException...

关于c# - 为什么子任务不会在 .ContinueWith 之前完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19999965/

相关文章:

C# One Writer Many Readers 只读一次

c# - 如何将 Windows.UI.Composition 动画集成到 UWP MVVM Light 应用程序中

c# - 如何在标记为内部的属性上使用 AutoMapper?

c# - IO绑定(bind)操作的并行执行

javascript - 在通过 child.print() 打印之前,如何等待图像加载到新窗口中?

c# - 需要修复我的查找中位数方法中的隐式转换错误

algorithm - 作业车间调度 : Shifting Bottleneck

c# - 正在为 C# 中的新任务处理免费资源

html - float 父级仅由内容 float div 扩展

mysql - 向表中添加子行,bootstrap bootply 示例