2

据我了解,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();

    }
4

1 回答 1

3

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

当您将 Action 传递给 Task.Run 时:

Task.Run(someAction);

这完全等同于:

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

在我看来,这会阻止孩子们按预期依附。

确实将起跑线更改为

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

似乎确实解决了这个问题。我通过查看他们在使用Factory.StartNew方法而不是Run.

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

于 2013-11-15T11:54:07.527 回答