获取任务状态 WaitingForChildrenToComplete 的示例代码

Example code for getting task status WaitingForChildrenToComplete

请给出获取任务状态 WaitingForChildrenToComplete 的示例代码。 我按照自己的想法做了一个例子,但是没有给出想要的状态。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            void MyMethod1()
            {
                Console.WriteLine("MyMethod1");
            }

            void MyMethod2(Task task)
            {
                Console.WriteLine("MyMethod2");
                Task MyTask = new Task(() => { Thread.Sleep(1000); Console.WriteLine(task.Status); }, TaskCreationOptions.AttachedToParent);
                MyTask.Start();
                Thread.Sleep(5000);                
            }
            
            Task MyTask = null;
            MyTask = Task.Run(() => MyMethod2(MyTask));
            MyTask.Wait();
        }
    }
}

这是一个例子:

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
    public static void Main()
    {
        Task parent = Task.Factory.StartNew(() =>
        {
            Task child = Task.Factory.StartNew(() => Thread.Sleep(200),
                TaskCreationOptions.AttachedToParent);
        });
        Thread.Sleep(100);
        Console.WriteLine($"Status: {parent.Status}");
    }
}

输出:

Status: WaitingForChildrenToComplete

Try it on Fiddle.

您的示例不起作用的原因是 Task.Run 方法是使用 TaskCreationOptions.DenyChildAttach option. You can read about this here 配置的 Task.Factory.StartNew 的快捷方式。

注意: 上面的示例旨在最小化,因此不遵循最佳实践。特别是 Task.Factory.StartNew 方法没有配置特定的 scheduler,现在很少使用 is not recommended, and might produce compiler warnings. Also be aware that the "attach to parent" 功能。据我所知,它在推出后不久就被微软自己认为是一个可疑模式,今天许多微软工程师很乐意回到过去并un-invent这个功能,如果回到过去是可能的话。