Async函数:await后的代码段由哪个线程执行?

本文探讨了在不同情况下C#中async函数中await关键字后的代码段执行线程的问题。默认情况下,await后的代码由执行Task的线程执行。使用TaskCompletionSource时,代码由调用SetResult的线程执行。而在自定义SynchronizationContext的场景下,await后的代码会根据SynchronizationContext的调度规则由相应线程执行。
摘要由CSDN通过智能技术生成

阅读本篇文章前需要C#多线程基础、Async函数基础、SynchronizationContext基础

 

默认情况

以下是测试代码:

 
        static void Main(string[] args)
        {
            Test0();

            Console.Read();
        }

        static void Test0()
        {
            AsyncMethod();
            
            Console.WriteLine("after calling AsyncMethod : " + Thread.CurrentThread.ManagedThreadId);
        }

        static async Task AsyncMethod()
        {
            Console.WriteLine("before await : " + Thread.CurrentThread.ManagedThreadId);
            await Task.Run(() =>
            {
                // 一个耗时的计算
                ConsumeTime();
                Console.WriteLine("Task : " + Thread.CurrentThread.ManagedThreadId);
            });
            Console.WriteLine("after await : " + Thread.CurrentThread.ManagedThreadId);
        }

执行结果:

可以看出,await后面的代码段是由执行Task的线程来执行的。

但资料上的理论知识还表示,由于在Task执行完之前,Thread1会挂起状态机返回执行Console.WriteLine("after calling AsyncMethod : " + Thread.CurrentThread.ManagedThreadId);,等到Task结束后,由Thread3恢复状态机,执行await后的代码,这种挂起操作是有消耗的。如果Task很快就执行完了,在Thread1返回之前就已经执行好了,这种情况下,如果还将状态机挂起,就白白损耗了性能。它很聪明,Thread1检测到自己返回前Task已经执行完毕,就不会将状态机挂起,并且由自己直接完成aw

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值