C#5.0支持的await格式

C#5.0引入了编译器支持的 async 和 await 关键字,这就为开发者提供了使用同步思想写异步代码的方便。

但是有些传统函数仅提供了异步回调实现,如何对其封装,使其可以享受await的便利呢?

举例来说,Windows Phone SDK 提供的 Contacts.SearchAsync() 函数,需要通过Delegate来处理Contacts.SearchAsync事件。

举个Windows Phone 8里面搜索联系人的代码如下:

void Contacts_SearchCompleted(object sender, ContactsSearchEventArgs e) {
try {
Debug.WriteLine(e.Results.Count());
}
catch (Exception ex) {
Debug.WriteLine(ex.ToString());
}
} private void btnSearchContacts_Click(object sender, RoutedEventArgs e) {
Contacts cons = new Contacts();
cons.SearchCompleted += new EventHandler<ContactsSearchEventArgs>(Contacts_SearchCompleted);
cons.SearchAsync("", FilterKind.None, "Contacts Test");
}

不是说这种回调方式不好,而是我认为下面这种使用await的方式调用会更好。

async private Task<IEnumerable<Contact>> SearchContacts(string filter, FilterKind filterKind, Object state) {
return await Task<IEnumerable<Contact>>.Run(
() => {
Debug.WriteLine("SearchContacts begin"); var signal = new ManualResetEvent(false);
IEnumerable<Contact> ret = null; Contacts cons = new Contacts();
cons.SearchCompleted += (o, e) => {
Debug.WriteLine("SearchContacts complete");
ret = e.Results;
signal.Set();
};
cons.SearchAsync(filter, filterKind, state);
signal.WaitOne();
signal.Dispose();
Debug.WriteLine("SearchContacts end");
return ret;
}
);
} async private void btnSearchContactsAwait_Click(object sender, RoutedEventArgs e) {
IEnumerable<Contact> cons = await SearchContacts("", FilterKind.None, "Contacts Test");
Debug.WriteLine(cons.Count());
}

将代码包装在Task里面,通过ManualResetEvent来控制代码流程,用起来超屌的。

爱生活,爱拉风
 

最新文章

  1. WEB安全--逻辑漏洞
  2. Android视频播放之VideoView
  3. 在腾讯云上创建您的SQL Cluster(4)
  4. Sprint第二个冲刺(第十二天)
  5. Sql分隔字符串方法--split
  6. Objhdu2001java
  7. Gamit的安装
  8. hdu 4963(中途相遇法)
  9. bzoj2151 种树 双向链表+堆
  10. 从一个git仓库拷贝到另一个git仓库
  11. SOD框架的Model、连接数据库及增删改查
  12. Ubuntu 进入、退出命令行的快捷键
  13. Arduino IDE for ESP8266 ()esp8266项目 WIFI攻击器
  14. Fiddler简介及web抓包
  15. Flex组件参考 代码参考汇总
  16. MySQL MHA 搭建&amp;测试(环境:CentOS7 + MySQL5.7.23)
  17. eclipse中ctrl+K失效
  18. windows下安装redis并设置自启动
  19. Python如何引入自定义模块?
  20. Codeforces Round #419 (Div. 2) E. Karen and Supermarket(树形dp)

热门文章

  1. android网络操作使用汇总(http)
  2. Struts2_2_第一Struts2应用
  3. Effective C++ 10
  4. leetcode -day31 Subsets I II
  5. 清掉kugo 7 和千千静听的广告
  6. 编写SQL的辅助工具
  7. Android中常用的颜色
  8. 更改MYSQL数据库不区分大小写表名
  9. ACE模板之Jqgrid
  10. setTimeout与setInterval的区别