我理解的C#的异步编程 async/await 篇

由于一直在从事C++方面的工作,所以C#用的比较少,最近半年来公司使用WPF,所以C#的一些东西还需要好好补一补,今天来说一下async与await的使用方法。

我先说一下async,这其实是个语法糖,微软帮我们做了很多工作,但是作为使用者,我现在还不想去关注具体是怎么实现的,我现在的理解就是使用async告诉调用者这是一个异步方法。如果async方法中没有await,那么这个函数会被当做同步方法来执行,如下:

 static void Main(string[] args)
        {
            Console.WriteLine("Before call async");
            Test1();
            Console.ReadKey();
        }

        static async Task<string> Test1()
        {
            Thread.Sleep(5000);
            return "result";
        }

上面代码会按照普通的调用去执行。如何才能实现异步调用呢,其实很简单,我们只需要把耗时的操作放在async函数中,使用await等待就可以了,具体操作如下: 

 static void Main(string[] args)
        {
            Console.WriteLine("Before call async");
            var t=CallTestAsync("LinTao");
            for (int i = 0; i < 10; i++)
            {
                Thread.Sleep(500);
                Console.WriteLine(i);
            }
            Console.WriteLine($"异步方法执行的结果是{t.Result}");

            //根据t的结果来决定下一步怎么做
            t.ContinueWith(tt=>Console.WriteLine($"Continue{tt.Result}"),CancellationToken.None);
            Console.ReadKey();
        }

        //拥有await的方法会被阻塞,但是调用该方法的会立即返回
        private static async Task<string> CallTestAsync(string Name)
        {
            Console.WriteLine("Before Call Sleep");
            var ret= await Task.Run(()=>Sleep(Name));
            Console.WriteLine("After Call Sleep");
            Console.WriteLine($"结果是{ret}");
            return ret;
        }

        //耗时的方法
        private static string Sleep(string Name)
        {
            Console.WriteLine($"Before {Name} Sleep");
            Thread.Sleep(7000);
            Console.WriteLine($"After {Name} Sleep");
            return $"{Name}'s Final name is {Name}+{Name}+{Name}";  
        }

如上所示,耗时的操作我们都放在Sleep()这个普通的函数里面,在CallTestAsync()这个异步方法里面我们采用await去等待耗时方法完成,并得到结果。但是作为主线程Main()函数里面发现async CallTestAsync()这个函数里面有await会立即返回到Main函数,不会等待CallTestAsync()这个函数执行完毕才返回主线程,所以有兴趣的同学可以把代码拷贝过去看一下结果,这里就不做赘述了。

今天就先看到这里,有一点很重要async里面如果没有await那么就与普通的同步方法并无二异,有了await就不一样了,会立即返回到调用线程。如果有错误欢迎大家指出来。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值