《C#并发编程经典实例》学习笔记—2.1 暂停一段时间
问题:
需要让程序(以异步方式)等待一段时间。
解决方案:Task类的静态函数Delay,返回Task对象
在github开源项目dotnet/coreclr
,找到Task.cs有关Delay方法的源码
github地址:
https://github.com/dotnet/coreclr/blob/master/src/System.Private.CoreLib/src/System/Threading/Tasks/Task.cs
/// <summary>/// Creates a Task that will complete after a time delay./// </summary>/// <param name="millisecondsDelay">The number of milliseconds to wait before completing the returned Task</param>/// <returns>A Task that represents the time delay</returns>/// <exception cref="T:System.ArgumentOutOfRangeException">/// The <paramref name="millisecondsDelay"/> is less than -1./// </exception>/// <remarks>/// After the specified time delay, the Task is completed in RanToCompletion state./// </remarks>public static Task Delay(int millisecondsDelay){return Delay(millisecondsDelay, default);}
Delay方法会创建一个延迟millisecondsDelay
毫秒后完成的任务。
millisecondsDelay
为 在完成返回的任务前要等待的毫秒数,如果值为-1,将无限期等待。
Delay方法有多个重载方法,如下
public static Task Delay(TimeSpan delay);
public static Task Delay(TimeSpan delay, CancellationToken cancellationToken);
public static Task Delay(int millisecondsDelay);
public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken);
书中给出三个例子。
一个是单元测试中,定义一个异步完成的任务,以完成“异步成功”测试。
static async Task<T> DelayResult<T>(T result, TimeSpan delay)
{await Task.Delay(delay);return result;
}
一个是指数退避的简单实现。
指数退避是一种重试策略,重试的延迟时间会逐次增加。在访问 Web 服务时,最好的方式就是采用指数退避,它可以防止服务器被太多的重试阻塞。
书中提到实际产品开发中,应对指数退避重试机制有更周密的解决方案。书中推荐了微软企业库中的瞬间错误处理模块(Transient Error Handling Block),在微软Docs中找到了相关文章。
暂时性故障处理 (构建使用 Azure 的真实世界云应用程序):
https://docs.microsoft.com/zh-cn/aspnet/aspnet/overview/developing-apps-with-windows-azure/building-real-world-cloud-apps-with-windows-azure/transient-fault-handling
static async Task<string> DownloadStringWithRetries(string uri){using (var client = new HttpClient()){// 第 1 次重试前等 1 秒,第 2 次等 2 秒,第 3 次等 4 秒。var nextDelay = TimeSpan.FromSeconds(1);for (var i = 0; i != 3; ++i){try{ return await client.GetStringAsync(uri);}catch{}await Task.Delay(nextDelay);nextDelay = nextDelay + nextDelay;}// 最后重试一次,以便让调用者知道出错信息。return await client.GetStringAsync(uri);}}
上述代码实现的是对异步get请求进行多次重试。
最后一个例子,是实现了一个简单的超时功能,当get请求在3秒内没有响应,返回null。
static async Task<string> DownloadStringWithTimeout(string uri){using (var client = new HttpClient()){var downloadTask = client.GetStringAsync(uri);var timeoutTask = Task.Delay(3000);var completedTask = await Task.WhenAny(downloadTask, timeoutTask);if (completedTask == timeoutTask)return null;return await downloadTask;}}
该代码的实现主要是借助于Task.WhenAny
方法。
Task.WhenAny
的返回值是提供的多个任务中已完成的任务。
如果已完成的任务completedTask
和timeoutTask
相等,证明最先完成的任务是等待三秒之后完成的任务timeoutTask
,也就是说downloadTask
没有在三秒内完成。
转载于:https://www.cnblogs.com/AlienXu/p/9562547.html
《C#并发编程经典实例》学习笔记—2.1 暂停一段时间相关推荐
- 《Java并发编程实践》学习笔记之一:基础知识
<Java并发编程实践>学习笔记之一:基础知识 1.程序与进程 1.1 程序与进程的概念 (1)程序:一组有序的静态指令,是一种静态概念: (2)进程:是一种活动,它是由一个动作序列组成 ...
- .net ticks 转java_《C#并发编程经典实例》—— 转换.NET事件
声明:本文是<C#并发编程经典实例>的样章,感谢图灵授权并发编程网站发布样章,禁止以任何形式转载此文. 问题 把一个事件作为 Rx 输入流,每次事件发生时通过 OnNext 生成数据. 解 ...
- 【极客时间】《Java并发编程实战》学习笔记
目录: 开篇词 | 你为什么需要学习并发编程? 内容来源:开篇词 | 你为什么需要学习并发编程?-极客时间 例如,Java 里 synchronized.wait()/notify() 相关的知识很琐 ...
- 【并发编程】(学习笔记-共享模型之管程)-part3
文章目录 并发编程-共享模型之管程-3 1.共享带来的问题 1-1 临界区 Critical Section 1-2 竞态条件 Race Condition 2.synchronized 解决方案 2 ...
- 《Java并发编程实战》学习笔记
什么是并发编程? 跳出来看全局就是3部分:分工.协作.互斥 钻进去看本质:技术的本质就是背后的理论模型 并发理论基础 并发编程产生bug的原因 可见性:cpu缓存导致共享变量在多核cpu的情况下,不可 ...
- Java并发编程实战(学习笔记十 第十一章 性能与可伸缩性)
线程的最主要目的是提高程序的运行性能.线程可以使程序更加充分地发挥系统的可用处理能力,从而提高系统的资源利用率.线程还可以在使程序在运行现有任务的情况下立即开始处理新的任务,从而提高系统的响应性. 本 ...
- 《Java 并发编程实战》--读书笔记
Java 并发编程实战 注: 极客时间<Java 并发编程实战>–读书笔记 GitHub:https://github.com/ByrsH/Reading-notes/blob/maste ...
- 《Java并发编程的艺术》笔记
<Java并发编程的艺术>笔记 第1章 并发编程的挑战 1.1 上下文切换 CPU通过时间片分配算法来循环执行任务,任务从保存到再加载的过程就是一次上下文切换. 减少上下文切换的方法有4种 ...
- 《Java编程思想》学习笔记【一对象导论】
重头学习Java,大一没怎么学,大二上课也没听.(流下不学无术的眼泪) 所有编程语言都提供抽象机制,我们所能解决的问题的复杂性直接取决于抽象的类型和质量. 汇编语言是对底层机器的轻微抽象," ...
- java 编程思想 多线程学习笔记
java 编程思想 多线程学习笔记 一.如何创建多线程? 1.继承 java.lang.Thread 类 2.实现 java.lang.Runnable 接口 3.Callable接口 总之,在任何线 ...
最新文章
- 30天敏捷结果(30):提升敏捷结果
- Direct3D Draw函数 异步调用原理解析
- JS操作Excel读取和写入(模板操作)
- Thunder团队Beta周贡献分分配结果
- python怎么做项目_听说你没有python项目可做,我教你个方法
- 2021 最新CV综述分类汇总(持续更新)
- 怎么用计算机弹histheme,来至世界最好的器乐演奏大合集可做音乐素材-Various Artists 2015 (20CD)FLAC/MP...
- c语言词法分析器的实验报告,C语言词法分析器构造实验报告
- 使用计算机时直接断电,电脑用着突然断电重启
- 18650圆柱锂电池comsol5.6模型 参数已配置,电化学生热研究,三种放电倍率
- 单片机指令MOV、MOVC、MOVX的区别与联系
- 一定要理解的两种常见软件开发体系结构(CS/BS结构)的区别!!!
- Mybatis报错01:Mapper method ‘com.feng.dao.UserMapper.deleteUser‘ has an unsupported return type: class
- css超出部分省略号显示
- 【HFSS】有限大阵列FA-DDM仿真
- iftop 监控端口流量状况
- 2、零基础学工控——详细了解西门子PLC
- win7安装oracle 黑屏,雨林木风 win7安装黑屏怎么解决
- 析构函数可以为纯虚函数吗?纯虚函数可以有函数体吗?纯虚函数需要函数体吗?
- 设计必备丨ICON素材哪里找 这五个素材库就够了