问题

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

解决方案

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

《C#并发编程经典实例》学习笔记—2.3 报告任务的更多相关文章

  1. 《C#并发编程经典实例》笔记

    1.前言 2.开宗明义 3.开发原则和要点 (1)并发编程概述 (2)异步编程基础 (3)并行开发的基础 (4)测试技巧 (5)集合 (6)函数式OOP (7)同步 1.前言 最近趁着项目的一段平稳期 ...

  2. 《C#并发编程经典实例》学习笔记—2.7 避免上下文延续

    避免上下文延续 在默认情况下,一个 async 方法在被 await 调用后恢复运行时,会在原来的上下文中运行. 为了避免在上下文中恢复运行,可让 await 调用 ConfigureAwait 方法 ...

  3. 《C#并发编程经典实例》学习笔记—3.1 数据的并行处理

    问题 有一批数据,需要对每个元素进行相同的操作.该操作是计算密集型的,需要耗费一定的时间. 解决方案 常见的操作可以粗略分为 计算密集型操作 和 IO密集型操作.计算密集型操作主要是依赖于CPU计算, ...

  4. 《C# 并发编程 · 经典实例》读书笔记

    前言 最近在看<C# 并发编程 · 经典实例>这本书,这不是一本理论书,反而这是一本主要讲述怎么样更好的使用好目前 C#.NET 为我们提供的这些 API 的一本书,书中绝大部分是一些实例 ...

  5. [书籍]用UWP复习《C#并发编程经典实例》

    1. 简介 C#并发编程经典实例 是一本关于使用C#进行并发编程的入门参考书,使用"问题-解决方案-讨论"的模式讲解了以下这些概念: 面向异步编程的async和await 使用TP ...

  6. 《C#并发编程经典实例》学习笔记-关于并发编程的几个误解

    误解一:并发就是多线程 实际上多线程只是并发编程的一种形式,在C#中还有很多更实用.更方便的并发编程技术,包括异步编程.并行编程.TPL 数据流.响应式编程等. 误解二:只有大型服务器程序才需要考虑并 ...

  7. 《C#并发编程经典实例》学习笔记-第一章并发编程概述

    并发编程的术语 并发 同时做多件事情 多线程 并发的一种形式,它采用多个线程来执行程序. 多线程是并发的一种形式,但不是唯一的形式. 并行处理 把正在执行的大量的任务分割成小块,分配给多个同时运行的线 ...

  8. 并发编程概述--C#并发编程经典实例

    优秀软件的一个关键特征就是具有并发性.过去的几十年,我们可以进行并发编程,但是难度很大.以前,并发性软件的编写.调试和维护都很难,这导致很多开发人员为图省事放弃了并发编程.新版.NET 中的程序库和语 ...

  9. 《Java并发编程实战》学习笔记 线程安全、共享对象和组合对象

    Java Concurrency in Practice,一本完美的Java并发参考手册. 查看豆瓣读书 推荐:InfoQ迷你书<Java并发编程的艺术> 第一章 介绍 线程的优势:充分利 ...

随机推荐

  1. 清理 zabbix 历史数据, 缩减 mysql 空间

    zabbix 由于历史数据过大, 因此导致磁盘空间暴涨,  下面是结局方法步骤 1. 停止 ZABBIX SERER 操作 [root@gd02-qa-plxt2-nodomain-web-95 ~] ...

  2. Android图标

    在线生成安卓App图标.IOS App图标 https://icon.wuruihong.com

  3. python基础之面向对象1

    一.面向对象VS面向过程 1.面向过程 2.面向对象 二.类与对象 1.类和对象 (1)基本概念 类和对象的内存图如下: 2.实例成员 (1)实例变量 (2)实例方法: 3.类成员: (1)类变量 ( ...

  4. 权限系统设计-day02

    练习中的问题: 1,<s:url action="employee_input" />这个标签用来让struts自动生成请求的路径,struts生成的路径是一个全路径, ...

  5. linux下SS 网络命令详解

    ss命令用来显示处于活动状态的套接字信息. ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容. 但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比n ...

  6. truffle unbox react 出坑指南

    最近几天差点就被这鬼东西给逼疯了,truffle init .truffle unbox webpack 不管我怎么运行都是对的,唯独truffle unbox react 不管在哪个windows都 ...

  7. Java 三种方式实现接口校验

    方法一:AOP 代码如下定义一个权限注解 package com.thinkgem.jeesite.common.annotation; import java.lang.annotation.Ele ...

  8. [Swift]LeetCode1019. 链表中的下一个更大节点 | Next Greater Node In Linked List

    We are given a linked list with head as the first node.  Let's number the nodes in the list: node_1, ...

  9. Java基础--Eclipse使用

    Eclipse是JavaWeb开发最常用的工具,下面详细介绍一下如何下载安装最新版Eclipse.本文eclipse的使用是在JDK安装配置完成的基础上进行的,否则Eclipse安装后可能无法运行程序 ...

  10. 完整的http请求分析

    首先我们要明白什么是http. http:超文本传输协议(HTTP,HyperText Transfer Protocol). 超文本传输协议是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必 ...