Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源
如果想让程序异步等待一段时间,可以考虑使用Task.Delay方法。
比如,在单元测试中模拟一个异步操作。
static async Task<T> DelayedResult<T>(T result, TimeSpan delay){await Task.Delay(delay);return result;}
又比如,当我们需要远程下载内容,由于远程服务器的状态未必稳定,如果只调用某个方法一次,未必能获取到想要的数据。
我们可以每隔一段时间调用方法一次,向远程服务器获取内容,比如第一次等待1秒,第二次等待2秒,第三次等待4秒,最后再尝试一次。也就是限次获取远程内容。
static async Task<string> DownloadFromRemote(string uri){using(var client = new HttpClient()){//先等待1秒var nextDelay = TimeSpan.FromSeconds(1);//尝试3次,到第3次结束循环for(int i = 0; i != 3; i++){try{return await client.GetStringAsync(uri);}catch(Exception ex){throw;}await Task.Delay(nextDelay);nextDelay = nextDelay + nextDelay;}//最后再尝试一次return await client.GetStringAsync(uri);}}
也可以限时获取远程内容。比如限时在3秒内获取远程资源,如果3秒内没有获取到就返回null。
static async Task<string> DonwloadFromRemote(string uri){using(var client = new HttpClient()){//从远程获取内容的任务var downloadTask = client.GetStringAsync(uri);//限时3秒的任务var timeoutTask = Task.Delay(3000);//获取以上2个任务的一种var completedTask = await Task.WhenAny(downloadTask, timeoutTask);//如果最终的任务等来的是限时任务,那就返回nullif(completedTask == timeoutTask){return null;}return await downloadTask;}}
参考资料:C#并发编程经典实例
Task.Delay方法的2个应用实例,单元测试等待,限时限次下载远程资源的更多相关文章
- .Net4.0如何实现.NET4.5中的Task.Run及Task.Delay方法
前言 .NET4.0下是没有Task.Run及Task.Delay方法的,而.NET4.5已经实现,对于还在使用.NET4.0的同学来说,如何在.NET4.0下实现这两个方法呢? 在.NET4.0下, ...
- NET4.5中的Task.Run及Task.Delay方法
- 15.3 Task Task.Yield和Task.Delay说明
https://blog.csdn.net/hurrycxd/article/details/79827958 书上看到一个Task.Yield例子,Task.Yield方法创建一个立即返回的awai ...
- Task C# 多线程和异步模型 TPL模型 【C#】43. TPL基础——Task初步 22 C# 第十八章 TPL 并行编程 TPL 和传统 .NET 异步编程一 Task.Delay() 和 Thread.Sleep() 区别
Task C# 多线程和异步模型 TPL模型 Task,异步,多线程简单总结 1,如何把一个异步封装为Task异步 Task.Factory.FromAsync 对老的一些异步模型封装为Task ...
- C# 以函数Action/Func/Task作为方法参数
以Action.Func.Task作为方法参数,mark一下 以Action为参数 public void TestAction() { //Action参数 ExecuteFunction(() = ...
- Task.Delay() 和 Thread.Sleep() 区别
1.Thread.Sleep 是同步延迟,Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Dela ...
- jQuery delay() 方法
定义和用法 delay() 方法对队列中的下一项的执行设置延迟. 语法 $(selector).delay(speed,queueName) 参数 描述 speed 可选.规定延迟的速度. 可能的值: ...
- Task扩展方法取消操作
/// <summary> /// 任务扩展,传入取消操作 /// </summary> public static class TaskExtensionDemo { //因 ...
- task.delay 和 thread.sleep
1.Thread.Sleep 是同步延迟. Task.Delay异步延迟. 2.Thread.Sleep 会阻塞线程,Task.Delay不会. 3.Thread.Sleep不能取消,Task.Del ...
随机推荐
- 【Python】Flask系列-URL和视图笔记
1.学习目标 熟悉Flask相关知识. 熟悉web开发流程. 能独立开发Flask项目. 2.环境配置 Python虚拟环境安装 因为python的框架更新迭代太快了,有时候需要在电脑上存在一个框架的 ...
- Nuxt学习笔记
参考地址:https://zh.nuxtjs.org/guide/installation 官网 http://jspang.com/2018/02/26/nuxt/ 1.目录结构 2.Nuxt常用 ...
- webapck编译打包stylus文件
先安装css-loader.stylus.stylus-loader npm install --save-dev css-loader npm install --save-dev stylus n ...
- VS2010上连接SQLite数据库
VS2010连接SQLite数据库 Visual studio 2010及以上版本,连接SQLite数据库 1.在Sqlite开发站点下载SQLite的.exe安装包 Ctrl+F搜索这条语句:Thi ...
- 虚拟机Failed to start LSB: Bring up/down networking
1.执行 service network restart 出现以下错误 Restarting network (via systemctl): Job for network.service f ...
- AngularJs(SPA)单页面SEO以及百度统计应用(下)
苍苍之天不得久视,堂堂之地不得久履 当你小心翼翼的开启服务端渲染的同时,一个问题不得不注意,使用内存模式去保存渲染过的页面,这样服务断掉重启后,缓存也没有了,所以这里我们使用mongdodb进行本地化 ...
- 4.自定义数据《jquery实战》
4.4 元素中的存储自定义数据 data([key],[value]) 在元素上存放数据,返回jQuery对象. key (String) 存储的数据名. key,value (String,Any) ...
- .NetCore关于Cap(RabbitMQ)结合MySql使用出现MySql相关类冲突问题解决办法
问题还原 引用了 DotNetCore.CAP.MySql MySql.Data.EntityFrameworkCore 在使用MySql相关对象的时候会出现如下冲突,在命名空间加入伪空间名称是不能解 ...
- oracle的sql语句大小写
我相信大家都知道,oracle数据库是区分大小写的,而且oracle的默认为大写的,也就是说你在sql脚本上面写的sql语句,oracle运行的时候,它会自动转化为大写的.注意一下,我这里举例子的计算 ...
- net mvc cms
.NET作品集:linux下的.net mvc cms cms程序架构 本程序是主要是用于企业网站开发的,也可以做博客程序,程序是从之前上一篇的.net 博客程序改进过来的,主要技术由webfor ...