[笔记]如何将传统的回调函数转换为C#5.0支持的await格式
来源:互联网 发布:cdo 首席数据官 编辑:程序博客网 时间:2024/06/06 10:47
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来控制代码流程,用起来超屌的。
<script type="text/javascript"><!--google_ad_client = "ca-pub-1944176156128447";/* cnblogs 首页横幅 */google_ad_slot = "5419468456";google_ad_width = 728;google_ad_height = 90;//--></script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"></script>
- [笔记]如何将传统的回调函数转换为C#5.0支持的await格式
- C#如何将DateTime的12小时格式转换为24小时时间格式
- 将一个浮点数,转换为指定格式的字符串
- 将类的成员函数注册为回调函数
- java中日期时间格式与毫秒数的转换如何将指定时间转换为Date类型
- 如何将GPT格式的硬盘转换为MBR
- 回调函数的笔记
- 不使用回调函数的ajax请求实现(async和await简化回调函数嵌套)
- 关于回调函数的书写格式
- c# 如何将带小数点的字符串转换为整型
- 将skia支持的其它格式图像转换为bmp8888的小工具
- 如何将gml格式的网络数据转换为可处理的格式
- 如何将GTiff格式的遥感图像转换为OpenCV可以读取的格式
- 将SQL Server的任意记录转换为JSON格式(JQGRID) -- 支持SQL 2005
- 如何将xml格式的字符串结合xsl文件转换为html 格式字符串输出
- sql语句中如何将datetime格式的日期转换为yy-mm-dd格式
- 如何将qlv格式的腾讯视频转换为mp4格式
- 什么是回调函数,如何定义和实现一个类的成员函数为回调函数(转)
- 直线生成算法---逐点比较法
- JSON 入门指南
- ssh2开发需要jar包
- C++的深拷贝与浅拷贝
- 猜测腾讯QQ的密码保护原理
- [笔记]如何将传统的回调函数转换为C#5.0支持的await格式
- 递归与分治2
- Java 泛型详解
- MFC中CFrameWnd::GetActiveView函数的使用
- android webview js交互, 响应webview中的图片点击事件
- 分析 JUnit 框架源代码
- 搭建Qt5.1.0Beta的Android开发环境
- ITAT(第二届)预赛试题A卷 Java程序设计
- c语言结构体的学习