C#中的异步编程Async 和 Await

谈到C#中的异步编程,离不开Async和Await关键字

谈到异步编程,首先我们就要明白到底什么是异步编程。 平时我们的编程一般都是同步编程,所谓同步编程的意思,和我们平时说的同时做几件事情完全不同。 在计算机的世界里,同步编程的意思说 按照顺序来执行,或者说是 一个接着一个地有序的来执行, 比如目前我们在代码中有三件任务来执行,那么必须先执行完第1件,再执行第2件,接下来再执行第3件。 在这个过程中,第1件没有完成,你是没法开始做第2件事情的,必须等待。

比如一个人烧开水需要10分钟,5分钟找杯子,5分钟找茶叶。 这件事情在同步编程的世界里需要20分钟完成,因为必须先烧开水10分钟,等烧完开水后。 才开始做第2件事情找杯子,花费5分钟。 找完杯子后,才开始做第3件事情-找茶叶,又花费5分钟。这样,整个过程就花费了20分钟。但其实这3件事情可以同时做,互相并不影响,这就是异步编程的概念了

由上面这个例子中可以发现,在计算机编程世界里,【异步编程】才是真正的同时进行事情,而【同步编程】是一件一件的有序执行。 上面的例子,如果采用异步编程,那么10分钟就可以全部完成。

在C#中,异步编程中有三个方面需要注意:

1.为了表示一个方法是异步方法,需要使用async关键字来修饰该方法签名

2. 异步方法的返回值类型 --- 只有 void, Task 和 Task<T>

3. 在异步方法内部,你需要使用await关键字来修饰一个可以等待的【可等待】类型,来实现异步

我们通过例子来比较同步编程和异步编程的不同

举例:  比如页面上有个【计算】按钮,点击该按钮 程序将会进行一个复杂运算,该运算将花费45秒的时间,运算完后返回计算结果,现实在页面的一个textbox文本框里面

private void btnCalculate_Click(object sender, EventArgs e)
{
     int calResult =   ToCalculate();
     this. Textbox1.Text = calResult;

}

private int ToCalculate()
{
   // 这里有复杂的计算过程,将耗时45秒, 我们这里通过让线程休眠45秒钟来模拟
     System.Threading.Thread.Sleep(45000); 

      return 100;

}

在上面代码中,我们假设方法ToCalculate方法要进行复杂的计算。在这里,我们通过让当前线程挂起45秒,来模拟耗时45秒的复杂计算过程.

我们可以想象得到,上面得代码中,当用户在界面上点击btnCalculate按钮时,UI在接下来的45秒里将毫无反应,程序将只干一件事情,就是允许ToCalculate方法来进行耗时45秒的复杂计算。45秒之后,才会把计算结果返回到Textbox1中,再接下来做其他的操作

这个显然非常的用户不友好,因为用户会发现他需要等在那里45秒,什么事情也不能干。如果在这个等待过程中,用户在UI上还能同时操作干其他的事情呢?  这个就需要涉及到异步编程的概念

【异步编程】的操作过程如下:

执行异步方法,当遇到await关键字时,表示要开始执行一个异步方法,await关键字来修饰的方法是一个方法。这个时候程序会做两件事情

第1件: 程序去执行await关键字修饰的异步方法

第2件: 在做第1件的同时,把控制权立即返回给调用者,也就是说调用者这个时候,可以在等待异步方法执行的过程中,同时去做其他事情,因为控制权已经在它手中了。

看看上面的例子,如果采用异步方法,当用户在界面上点击btnCalculate按钮时,程序会执行异步方法ToCalculate. 但与此同时,控制权也马上回到UI手上,也就是说在后台进行耗时45秒的复杂计算的同时,用户可以同时在UI上进行其他操作。当异步计算结束,把计算结果显示在UI的Textbox1上。

了解了整个过程后,我们使用异步方法来改写上面的代码

private async void btnCalculate_Click(object sender, EventArgs e)
{
     int calResult =   await ToCalculate();
     this. Textbox1.Text = calResult;
}

private Task<int> ToCalculate()
{
   //将复杂计算的过程放入一个Task<int>中,新开线程
   var t = Task.Run(()=>
   {
      System.Threading.Thread.Sleep(45000);
      return 100;
   });
   //返回的是这个Task<int>
   return t;
}

从上面的代码变动中,我们可以看到几处变动情况

1. 在方法的签名中,在public后面加入了async关键字, 将该方法标识成一个异步方法。 这样,让程序知道这个方法是一个异步方法, 此时它内部的await才会被认为是一个关键字。

原文地址:https://www.cnblogs.com/wphl-27/p/10534704.html

时间: 2024-10-15 20:45:11

C#中的异步编程Async 和 Await的相关文章

Async in C# 5.0(C#中的异步编程Async) 蜗牛翻译之第一章

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,祝各位爱技术的园友在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力

.NET4.5 异步编程 async和await

msdn介绍:https://msdn.microsoft.com/zh-cn/library/hh191443.aspx 其实很简单,标记了async的方法为异步方法,从方法的左大括号开始同步执行,直到第一个await出现就开始异步执行,主线程等待,等带await这行代码异步完了再回到主线程,然后继续往下执行. 如果后面又遇到带await语句的,又异步执行,执行完了就回来,继续同步往下.依此类推. 这样做其实就把我们以前编写等待句柄接收信号的代码给省掉了,就一个await就搞定. Visual

异步编程- async和await

html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption

.net 异步编程async &amp; await关键字的思考

C# 5.0引入了两个关键字 async和await,这两个关键字在很大程度上帮助我们简化了异步编程的实现代码,而且TPL中的task与async和await有很大的关系 思考了一下异步编程中的async & await关键字,对两个关键字尤其是await关键字一直很迷糊,因此深入思考了一下.首先借助的示例是:[你必须知道的异步编程]C# 5.0 新特性--Async和Await使异步编程更简单这是博客园一个大牛写的,自己也一直关注这个大神,不得不说,博客园大神很多,而且氛围也很好.我引入了其中

异步编程Async/await关键字

异步编程Async \await 关键字在各编程语言中的发展(出现)纪实. 时间 语言版本 2012.08.15 C#5.0(VS2012) 2015.09.13 Python 3.5 2016.03 ECMAScript 2016 (ES7) C#中的用法和浅层次原理 我是占位代理 Python中的用法,和协程 我是占位代理 Javascript中的说明 我是占位代理,不懂具体用法.

.Net中的异步编程

.Net中的异步编程? .net中实现异步有两种方式:第一种是多线程的方式,第二种是使用异步函数,其实在异步函数中使用的还是多线程的技术. 异步编程中比较关注也比较重要的技术点在于:1.当异步线程在工作完成时如何通知调用线程:2.当异步线程出现异常的时候该如何处理: 3.异步线程工作的进度如何实时的通知调用线程:4.如何在调用线程中取消正在工作的异步线程,并进行回滚操作. 虽然在.net中提供了众多的异步编程模式,但是推荐最好使用Task类,因为Task类使用线程池中的任务线程,又由线程池管理,

promise 的基本概念 和如何解决js中的异步编程问题 对 promis 的 then all ctch 的分析 和 await async 的理解

* promise承诺 * 解决js中异步编程的问题 * * 异步-同步 * 阻塞-无阻塞 * * 同步和异步的区别? 异步;同步 指的是被请求者 解析:被请求者(该事情的处理者)在处理完事情的时候的通知机制. 异步:当事情处理完成后被请求者会发信息通知请求者该事情处理完成.在这期间被请求者可以选择是继续等待命令请求完成还是去做其他事等待被请求者返回. 同步:当事情处理完成后被请求者不会告知请求者,等到请求者发来询问是才会告知 阻塞:非阻塞 指的是请求者 阻塞:针对请求者来说的,委托其他人处理一

C#中的异步编程:await和async

根据代码示例来学习, 创建一个函数来模拟时间消耗的方法,此处为GetSomeThing函数. 要使用异步编程,需要使用一个async修饰的方法来包装调用GetSomeThing函数,此函数的返回值为Task类型,该类型表示进行并行运算的任务引用.此处示例为ConsumeManyTime函数. 现在就可以直接使用异步方式了,参考TestOne()函数中的代码,其实就是直接调用第二步中的函数ConsumeManyTime(); 总结:异步编程虽然示例三步,但是实际上就是两步的事情,第一步是模拟应用,

[C#] 谈谈异步编程async await

为什么需要异步,异步对可能起阻止作用的活动(例如,应用程序访问 Web 时)至关重要. 对 Web 资源的访问有时很慢或会延迟. 如果此类活动在同步过程中受阻,则整个应用程序必须等待. 在异步过程中,应用程序可继续执行不依赖 Web 资源的其他工作,直至潜在阻止任务完成. 本节将一步一步带领大家理解async和await. 期间会有 Hello World,原理介绍,异步会提高程序的运行速度吗,async和await,MVC中的异步Action,以及线程中常涉及到的线程安全和信号量,以及微软提供