c# 的 async、await、Task 如何使用


async、await、Task这三个,大多数情况下,都是会同时出现的,它们控制着异步代码,简单说你可以理解成一个线程。

有await关键字,就必然会有async,当方法体内会有返回值时,也会必然有Task。

对于调用者来说,他就有两种调用方式:

1.也是调用时加上await关键字,这样在他调用的局部代码中是“同步”的;

2.调用的时候用Task类型来接收,这样就相当于创建了一个非阻塞的线程,执行你的代码,然后代码去干其他事情,等需要返回结果的时候,调用Task的Result属性,若此时异步代码已经执行完,便可以立马拿到返回结果,若还没执行完,则会同步等待返回结果,如果只是调用了异步方法,并没有做任何的await或等待Result的话,则是完全不阻塞的。

而不带async、await、Task的方法,就是普通的同步代码,需要多线程执行时,要么包装到Task中去执行,要么创建一个Thread去执行。

下面简单写个demo程序演示下同步和异步的效果:

        public static int DoSomething(string str)
        {
            Console.WriteLine("同步代码开始,传入的参数是:" + str);
            Thread.Sleep(2000);//模拟一些耗时的操作,如读取文件、网络请求等
            Console.WriteLine("同步代码结束,传入的参数是:" + str);
            return 1;
        }

        public static async Task<int> DoSomethingAsync(string str)
        {
            Console.WriteLine("异步代码开始,传入的参数是:" + str);
            await Task.Delay(2000);//模拟一些耗时的操作,如读取文件、网络请求等
            Console.WriteLine("异步代码结束,传入的参数是:" + str);
            return 1;
        }

然后不同的调用方式:

            var sw = Stopwatch.StartNew();
            var sum = DoSomething("sync");
            Console.WriteLine("我去做其他的事情,大约需要1s");
            Thread.Sleep(1000);
            Console.WriteLine("同步代码耗时:" + sw.ElapsedMilliseconds + "ms");
            Console.WriteLine("\r\n-----------------------分割线----------------------\r\n");
            sw.Restart();

            DoSomethingAsync("async1");
            Console.WriteLine("异步代码不等待耗时:" + sw.ElapsedMilliseconds + "ms");
            Console.WriteLine("\r\n-----------------------分割线----------------------\r\n");

            sw.Restart();
            var task = DoSomethingAsync("async2");
            Console.WriteLine("我先去做其他的事情,大约需要1s");
            Thread.Sleep(1000);
            var result = task.Result;
            Console.WriteLine("异步代码需要等待返回结果的时候耗时:" + sw.ElapsedMilliseconds + "ms");
            Console.WriteLine("\r\n-----------------------分割线----------------------\r\n");

            sw.Restart();
            await DoSomethingAsync("async3");
            Console.WriteLine("我先await再去做其他的事情,大约需要1s");
            Thread.Sleep(1000);
            Console.WriteLine("await异步代码的时候耗时:" + sw.ElapsedMilliseconds + "ms");

运行结果如下:

可以看出:

同步代码是完全的阻塞,按代码先后顺序依次执行的;

而异步不等待的,完全就是非阻塞的;

而Task.Result的形式,则是同步和异步在同时运行,最终耗时以耗时较长的为准;

await异步代码,则和同步的效果是差不多的。

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值