经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » C# » 查看文章
《C#并发编程经典实例》学习笔记—2.3 报告任务
来源:cnblogs  作者:repeatedly  时间:2018/12/20 9:44:58  对本文有异议

问题

异步操作时,需要展示该操作的进度

解决方案

IProgress<T> InterfaceProgress<T> Class

插一段话:读《C#并发编程经典实例》这本书偶有困惑,深感书中内容过于精炼,或许是作者故意为之,但显然对我这般知识浅薄的人来说,读起来这本书感到晦涩。偶然找到作者的个人博客,看到作者博客中对某一个知识点不同时间点上由浅至深的研究,十分欣喜。作者个人博客地址:https://blog.stephencleary.com/

可查看此书作者博客中相关Progress的文章Reporting Progress from Async Tasks了解更多一手知识

文中作者多次提到UI线程,很困惑,因为最近几年基本没在工作中写WPF、WebForm或者WinForm,所以作者说UI线程时很困惑,将其带入WPF、WebForm或者WinForm的使用场景,就好理解了。

不在废话,上文中伪代码例子

  1. static async Task MyMethodAsync(IProgress<double> progress = null)
  2. {
  3. double percentComplete = 0;
  4. while (!done)
  5. {
  6. ...
  7. if (progress != null)
  8. progress.Report(percentComplete);
  9. }
  10. }

Progress只有一个Report方法,Report报告进度更改

  1. static async Task CallMyMethodAsync()
  2. {
  3. var progress = new Progress<double>();
  4. progress.ProgressChanged += (sender, args) =>
  5. {
  6. ...
  7. };
  8. await MyMethodAsync(progress);
  9. }

注意

  1. IProgress<T>参数可以为空,这意味着该异步操作不需要报告更改进度。
  2. Report方法可以是异步的,这样的话,MyMethodAsync执行过程中,可能Report方法还未执行,进度还没有被更新。这样的话,T最好是一个不可变类型,值类型最好,如果T非要使用可变类型,最好每次Copy一个副本。
  3. 如果一个方法可以报告进度,最好也应该可以被取消。
  4. Progress 会在创建时捕获当前上下文,并且在这个上下文中调用回调函数。这意味着,如果在 UI 线程中创建了 Progress ,就能在 Progress 的回调函数中更新 UI,即使异步方法是在后台线程中调用 Report 的。

关于如何使用进度,并可以取消该方法的文章,可查看4.5 中的异步: 启用进度和异步 Api 中的取消

异常

Progress<T>.ProgressChanged不会抛出异常,或者说它抛出的异常会直接抛给上下文context

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号