《Async in C# 5.0》第三章 手动编写异步代码

本文介绍了在不使用C# 5.0的async关键字时,如何手动编写异步代码,包括.NET中的异步模式如基于事件的异步模式(EAP)和IAsyncResult接口,以及Task的使用。手动编写异步代码存在的问题,如代码分割、回调方法的使用,以及在多层异步调用时的复杂性。最后,通过WPF应用程序的例子展示了如何手动实现异步下载图标并解决UI阻塞问题。
摘要由CSDN通过智能技术生成

在本章中,我们将探讨一下如何在不使用C# 5.0以及async的情况下去编写异步代码。这样做会帮助你理解异步背后到底发生了什么。基于这个原因,我会带着你快速过一下例子,然后将需要我们重点理解的地方告诉你。

.NET中采用的异步模式

正如我之前所说,Silverlight只提供异步版本的API。下面是一个下载网页内容并进行显示的例子

private void DumpWebPage(Uri uri)
{
	WebClient webClient = new WebClient();
	webClient.DownloadStringCompleted += OnDownloadStringCompleted;
	webClient.DownloadStringAsync(uri}
}

private void OnDownloadStringCompleted(object sender, DownloadStringCompletedEventArgs eventArgs)
{
	m_TextBlock.Text = eventArgs.Result;
}

像这种类型的API被称作基于事件的异步模式(Event-based Asynchronous Pattern - EAP)。其基本思想:没用采用同步方法来下载网页,因为这样会导致下载完成前程序被阻塞,EAP采用的是一个方法外加一个事件的方式。下载网页的方法看起来和同步方法很相似,只不过它的返回值是void,事件的处理方法的参数带着下载下来的网页信息。

程序在调用下载网页的API(第5行)之前先订阅了DownloadStringCompleted事件,因此当执行到第5行时方法会立即返回——因为这是异步的API。这样,当将来下载的工作完成后,API内会触发DownloadStringCompleted事件,从而之前订阅的事件回调方法(OnDownloadStringCompleted)就被执行了。

这种模式看起来有点乱,因为它需要将原本应该很简单的流程分割成了两个方法。更重要的是,你还需要订阅事件,而这无形之中又增加了复杂性。如果你在程序中继续使用webClient实例去处理其它请求,你应该不希望它原来订阅的事件在新的请求中被触发。

另外一种异步模式用到了IAsyncResult接口。举个例子:Dns类中有一个方法BeginGetHostAddresses可以根据主机名查询其IP地址,这种模式需要两个方法,一个叫做BeginMethodName,它的职责是开始耗时操作;另一个方法被命名为EndMethodNameÿ

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值