C# 异步操作 async await
2016-10-08 13:16
976 查看
在编程的过程中,我们会遇到很多需要异步操作的场景。比如要下载一个文件,如果使用同步的方式进行下载,那么UI操作就会被卡住,这时最好能够使用异步的方式进行下载。在C#中,很早就开始支持异步的操作了,只不过早期的方法写起来有些麻烦。到了C# 5.0的时候,直接添加了两个关键字:async 和 await,这下对异步操作的支持可谓是达到了完美。下面我们就通用一个简单的 demo 看一下它们的基本用法。
在执行 DownloadFile 方法的过程中,UI线程被卡死,整个的下载过程中应用程序都处于没响应的状态。这当然是不能接受的,所以我们应该使用下面的异步方式进行文件的下载。
好吧,事情变得稍微有点复杂了。一个简单的下载逻辑居然被分隔到了两个方法中!在第一个方法中挂载 DownloadFileCompleted 事件,然后启动下载。下载完成后通过 DownloadFileCompleted 事件处理函数进行通知。如果您能够习惯于这样的写法,其实C# 早期提供的异步编程接口已经足够用了,因为这也正是异步操作真正的实现方式。
但是,作为程序员,我们是不会满足的,永远不会…
注意代码中 async 和 await 关键字的位置,这样代码就是以异步方式去执行下载逻辑,整个过程中UI 操作不会被阻塞掉。是不是很神奇呢?
这段代码最大的魔力在于它和同步下载文件的代码几乎相同!每个 人都喜欢写顺序执行的代码,这样的代码逻辑也最清晰。async 和 await 的最大优势就是把人脑感觉简单的代码转换为真正的异步操作逻辑。
下载一个文件
我们先看看用同步的方式下载一个文件:private void btnOldDownload_Click(object sender, EventArgs e) { using(WebClient wc = new WebClient()) { // 我们尝试去下载 python 的安装包。 wc.DownloadFile("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe", "python.exe"); } lbMessage.Text = "下载完成。"; }
在执行 DownloadFile 方法的过程中,UI线程被卡死,整个的下载过程中应用程序都处于没响应的状态。这当然是不能接受的,所以我们应该使用下面的异步方式进行文件的下载。
异步下载文件
我们先看一下使用早期的异步代码去下载文件:private void OldAsyncDownload_Click(object sender, EventArgs e) { using (WebClient wc = new WebClient()) { // 我们尝试去下载 python 的安装包。 // 下载完成时会有事件通知。 wc.DownloadFileCompleted += Wc_DownloadFileCompleted; wc.DownloadFileAsync(new Uri("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe"), "python.exe"); } } private void Wc_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e) { lbMessage.Text = "下载完成。"; }
好吧,事情变得稍微有点复杂了。一个简单的下载逻辑居然被分隔到了两个方法中!在第一个方法中挂载 DownloadFileCompleted 事件,然后启动下载。下载完成后通过 DownloadFileCompleted 事件处理函数进行通知。如果您能够习惯于这样的写法,其实C# 早期提供的异步编程接口已经足够用了,因为这也正是异步操作真正的实现方式。
但是,作为程序员,我们是不会满足的,永远不会…
async await 方式
在C# 5.0 中引入了 async 和 await 关键字,它们使得异步操作的实现更加简单、容易!private async void btnMyAsync_Click(object sender, EventArgs e) { using (WebClient wc = new WebClient()) { // 我们尝试去下载 python 的安装包。 Task task = wc.DownloadFileTaskAsync("https://www.python.org/ftp/python/3.5.2/python-3.5.2-amd64.exe", "python.exe"); // 可以在这里执行代码。 await task; } lbMessage.Text = "下载完成。"; }
注意代码中 async 和 await 关键字的位置,这样代码就是以异步方式去执行下载逻辑,整个过程中UI 操作不会被阻塞掉。是不是很神奇呢?
这段代码最大的魔力在于它和同步下载文件的代码几乎相同!每个 人都喜欢写顺序执行的代码,这样的代码逻辑也最清晰。async 和 await 的最大优势就是把人脑感觉简单的代码转换为真正的异步操作逻辑。
相关文章推荐
- C# 异步操作 async await 的用法
- async/await 异步操作 .net csharp C#
- C#使用SocketAsyncEventArgs操作套接字的简单异步通讯
- 利用async和await异步操作解决node.js里面fs模块异步读写,同步结果的问题
- C# 异步调用之async及await关键字
- C# Async/await 异步多线程编程
- 请教 C# 异步 async await 问题
- async/await与promise(nodejs中的异步操作问题)
- [.NET] 利用 async & await 进行异步 IO 操作
- C# Async/await 异步多线程编程
- 【C#】50.使用await操作连续的异步任务
- c# 异步、重入、Async、Await
- C# Async/await 异步多线程编程
- .NET异步操作学习之一:Async/Await中异常的处理
- .NET/C# 使用async和await关键字调用异步方法
- C# 中 async/await 调用传统 Begin/End 异步方法
- 【C#复习总结】 Async 和 Await 的异步编程
- 我也来说说C#中的异步:async/await
- C#异步中的Task,async,await
- [C#] .NET4.0中使用4.5中的 async/await 功能实现异步