HTML5技术

C#与C++的发展历程第三 - C#5.0异步编程巅峰 - hystar(14)

字号+ 作者:H5之家 来源:博客园 2016-01-15 10:03 我要评论( )

通过参数可以看到,这个转换Task的过程支持调用方法传入的取消和进度报告。如果我们需要调用的WinRT异步方法的过程中支持取消和进度报告,就不能直接await那个异步方法(相当于调用了默认无参的AsTask的返回task上

通过参数可以看到,这个转换Task的过程支持调用方法传入的取消和进度报告。如果我们需要调用的WinRT异步方法的过程中支持取消和进度报告,就不能直接await那个异步方法(相当于调用了默认无参的AsTask的返回task上的GetAwaiter方法),而是应该await显示调用的AsTask(可以传入CancellationToken及IProgress参数的重载,上面那个)返回的task对象。这个可以见本小节末尾处的例子。

回头看一下上面给出的AsTask的实现。里面一个最终要的对象就是TaskToAsyncOperationWithProgressAdapter<TResult, TProgress>,其可以由IAsyncOperationWithProgress<TResult, TProgress>直接转型而来。它也是IAsyncOperationWithProgress<TResult, TProgress>和Task之间的一个桥梁。这个类的工作主要由其父类TaskToAsyncInfoAdapter<TCompletedHandler, TProgressHandler, TResult, TProgressInfo>来完成。这个父类的实现就比较复杂了,但道理都是相同的。有兴趣的同学自行查看其实现吧。

 

了解了原理最后来看一下代码示例,WinRT中所有的IO相关的类中只提供异步方法,示例因此也选择了这个使用最广泛的功能(示例代码来源是某开源库,具体是啥忘了,有轻微改动):

public async Task<string> ReadTextAsync(string filePath) {     var text = string.Empty;     using (var stream = await ReadFileAsync(filePath))     {         using (var reader = new StreamReader(stream))         {             text = await reader.ReadToEndAsyncThread();         }     }     return text; }

有了async/await和上文介绍的扩展方法的支持,C#调用WinRT的异步接口和使用.NET中的异步接口一样的简单。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • 2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博主怎么一步步走向失业) - 蒋启钲

    2年前端学习历程,与找不到工作的悲愤与吐槽!(100%真实经历,看博

    2017-03-29 11:00

  • 开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街,有赞等平台 - 大壮他哥

    开源第三方登录组件OAuthLogin2.0 支持QQ,阿里巴巴,淘宝,京东,蘑菇街

    2017-01-20 15:00

  • 从零到百亿互联网金融架构发展史 - 纯洁的微笑

    从零到百亿互联网金融架构发展史 - 纯洁的微笑

    2017-01-14 13:00

  • 记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗与新榜等第三方平台) - 彩色铅笔

    记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗

    2017-01-12 10:01

网友点评