.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态

.NET 中 如果一个Task A正在await另一个Task B,那么Task A是什么状态?答案是:WaitingForActivation

 

新建一个.NET Core控制台程序,输入如下代码:

class Program
{
    static void Main(string[] args)
    {
        //启动outer task,然后在outer task里面启动inner task
        var outerTask = Task.Run(async () =>
        {
            //await 之前执行
            Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task began!");

            //启动inner task
            var innerTask = Task.Run(() =>
            {
                //inner task 的线程沉睡5秒
                Thread.Sleep(5000);
            });

            //输出outer task即将开始await
            Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task will await!");
            await innerTask;//在outerTask的线程中await innerTask的Task线程

            //await 完成之后执行,从下面的输出可以看到,await之后的代码是使用一个新的线程来执行的,因为下面的Thread ID和await之前发生了变化
            Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer task will be finished!");
        });

        Thread.Sleep(1000);//主线程沉睡1秒,之后outer task的线程肯定开始执行了
        Console.WriteLine($"Outer task status:{outerTask.Status.ToString()}");//检查outer task的状态,可以看到此时状态为WaitingForActivation
        Thread.Sleep(6000);//沉睡6秒,之后outer task和inner task的线程肯定结束执行了,也就是说outerTask和innerTask应该都结束了
        Console.WriteLine($"Outer task status:{outerTask.Status.ToString()}");//再次检查outer task的状态,可以看此时状态为RanToCompletion

        Console.WriteLine();
        Console.WriteLine();
        Console.WriteLine("Press key contiune...");
        Console.ReadKey();
    }
}

 

执行结果如下:

所以如果一个task在await另一个task,那么其状态就是WaitingForActivation

 

此外我们还可以更改上面代码中的outerTask为一个后台线程outerThread来做同样的测试,代码如下:

class Program
{
    //定义outer thread为Program类的静态变量,这样我们在其执行方法OuterThreadRun中也可以检查outer thread的状态
    static Thread outerThread;

    //这是outer thread的执行方法,其在outer thread里面启动inner task
    static async void OuterThreadRun()
    {
        //await 之前执行
        Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread began!");

        //显示在执行中的outer thread的状态,此时状态显示为Background,因为outer thread为后台线程,所以Background表示后台线程正在执行
        Console.WriteLine($"Thread ID { Thread.CurrentThread.ManagedThreadId.ToString() } : Outer thread status:{outerThread.ThreadState.ToString()}");

        //启动inner task
        var innerTask = Task.Run(() =>
        {
            //inner task 的线程沉睡5秒
            Thread.Sleep(5000);
        });

        //输出outer thread即将开始await
        Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread will await!");
        await innerTask;//在outer thread线程中await innerTask的Task线程

        //await 完成之后执行,从下面的输出可以看到,await之后的代码是使用一个新的线程来执行的,因为下面的Thread ID和await之前发生了变化
        Console.WriteLine("Thread ID " + Thread.CurrentThread.ManagedThreadId.ToString() + " : Outer thread will be finished!");
    }

    static void Main(string[] args)
    {
        //初始化outer thread,绑定执行方法为OuterThreadRun,并设置IsBackground为true,即后台线程
        outerThread = new Thread(new ThreadStart(OuterThreadRun))
        {
            IsBackground = true
        };

        //开始执行outer thread
        outerThread.Start();

        Thread.Sleep(1000);//主线程沉睡1秒,之后outer thread线程肯定开始执行了
        Console.WriteLine($"Outer thread status:{outerThread.ThreadState.ToString()}");//检查outer thread的状态,可以看到此时状态为Stopped,因为现在outer thread正在await innerTask,这说明await中的线程状态是Stopped
        Thread.Sleep(6000);//沉睡6秒,之后outer thread线程和inner task的线程肯定结束执行了,也就是说outerThread和innerTask应该都结束了
        Console.WriteLine($"Outer thread status:{outerThread.ThreadState.ToString()}");//再次检查outer thread的状态,可以看此时状态为Stopped,因为outerThread和innerTask都结束运行了

        Console.WriteLine();
        Console.WriteLine();
        Console.WriteLine("Press key contiune...");
        Console.ReadKey();
    }
}

 

结果如下所示:

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值