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. R语言中的logical(0)和numeric(0)以及赋值问题
  2. Linux信号类型说明
  3. iOS RC4加解密算法
  4. Unity3d 合作开发项目
  5. sql server 查找指定字符串的位置
  6. IOS常用第三方库《转》
  7. Odoo 10的Linux安装
  8. php的运行模式
  9. 贝叶斯分类器,随机森林,梯度下载森林,神经网络相关参数的意义和data leakage
  10. js统计文本框剩余可输入字数
  11. 如何知道局域网内哪些ip被占用----工具法Free IP Scanner
  12. JavaEE学习总结(十二)—MyEclipse开发工具与HTML
  13. 一次cookie引起系统不断要求重新登录问题分析
  14. 第 15 章 位操作(invert4)
  15. 【Luogu P4074】[WC2013]糖果公园(树上带修改莫队)
  16. VS2017插件开发-项目右键菜单
  17. 6、redis之使用spring-data-redis的Template
  18. Arduino——My-Clock项目 发布时间:2018-12-31
  19. springcloud-07-eureka HA的高可用配置
  20. The dd command of linux

热门文章

  1. form表单右边弹窗提示不能为空
  2. 收集别人的一些第三方(MARK)
  3. latex math
  4. linux和pycharm下终端彩色打印输出
  5. 第二百零三节,jQuery EasyUI,Window(窗口)组件
  6. C# 持续序列化对象追加到文件的方法
  7. go反射----1类型
  8. 用js判断页面是否加载完成
  9. haml入门
  10. Python如何利用多核处理器