C#基于任务的异步模式

在 .NET Framework 4.5 中,更新了 WebClient 类,还提供了基于任务的异步模式(TAP)。该模式定义了一个带有 “Async” 后缀的方法,并返回一个 Task 类型。由于 WebClient 类已经提供了一个带 Async 后缀的方法来实现基于任务的异步模式,因此新方法名为 DownloadStringTaskAsync。.

DownloadStringTaskAsync 方法声明为返回 Task<string>。但是,不需要声明一个 Task<string> 类型的变量来设置 DownloadStringTaskAsync 方法返回的结果。只要声明一个 String 类型的变量,并使用 await 关键字。await 关键字会解除线程(这里是UI 线程)的阻塞,完成其他任务。当 DownloadStringTaskAsync 方法完成其后台处理后,UI 线程就可以继续,从后台任务中获得结果,赋值给字符串变量 resp。然后执行await 关键字后面的代码:

private static async Task TaskBasedAsyncPatternAsync() {  Console.WriteLine(nameof(TaskBasedAsyncPatternAsync));   using (var client = new WebClient())  {    string content = await client.DownloadstringTaskAsync(url);     Console.WriteLine(content.Substring(0,100));     Console.WriteLine();  }}

注意

async 关键字创建了一个状态机,类似于 yield return 语句。

现在,代码就简单多了。没有阻塞,也不需要切换回 UI 线程,这些都是自动实现的。代码顺序也和惯用的同步编程一样。

注意

更现代的 HTTP 客户端是用类 HttpClient 实现的。这个类提供的异步方法支持基于任务的异步模式。