C# 异步操作 async await

简介:

在编程的过程中,我们会遇到很多需要异步操作的场景。比如要下载一个文件,如果使用同步的方式进行下载,那么UI操作就会被卡住,这时最好能够使用异步的方式进行下载。在C#中,很早就开始支持异步的操作了,只不过早期的方法写起来有些麻烦。到了C# 5.0的时候,直接添加了两个关键字:async 和 await,这下对异步操作的支持可谓是达到了完美。下面我们就通用一个简单的 demo 看一下它们的基本用法。

下载一个文件

我们先看看用同步的方式下载一个文件:

复制代码

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 的最大优势就是把人脑感觉简单的代码转换为真正的异步操作逻辑。














本文转自xmgdc51CTO博客,原文链接:http://blog.51cto.com/12953214/1942276 ,如需转载请自行联系原作者


相关文章
|
1天前
|
编译器 数据处理 C#
C#中的异步流:使用IAsyncEnumerable<T>和await foreach实现异步数据迭代
【1月更文挑战第10天】本文介绍了C#中异步流的概念,并通过使用IAsyncEnumerable<T>接口和await foreach语句,详细阐述了如何异步地迭代数据流。异步流为处理大量数据或需要流式处理数据的场景提供了一种高效且非阻塞性的方法,使得开发者能够更优雅地处理并发和数据流问题。
|
1天前
|
C#
C#同步异步详解
C#同步异步详解
9 0
|
1天前
|
C#
C#学习系列相关之多线程(四)----async和await的用法
C#学习系列相关之多线程(四)----async和await的用法
|
6月前
|
C#
C#异步详解
c#异步编程原理,await asnyc的使用方法
35 0
|
9月前
|
C# 开发者
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
主要类 1.NamedPipeClientStream 2.NamedPipeServerStream 解释:命名管道是一种进程间通信的方式,它允许不同进程之间在同一台机器上进行通信
471 2
C# 开发者技术:进程间数据共享之管道(Pipes)-异步通信版
|
10月前
|
存储 前端开发 API
C# 从做早餐看同步异步
C# 从做早餐看同步异步
41 0
|
11月前
|
存储 SQL 设计模式
C#异步有多少种实现方式?
C#异步有多少种实现方式?
|
C#
C#中await和async关键字的简单理解
C#中await和async关键字的简单理解
46 0
c#异步多线程
c#异步多线程
60 0
|
C#
C#多线程开发-处理异步操作中的异常
C#多线程开发-处理异步操作中的异常
156 0