【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?

前文传送门 dotNET开发系列

收藏!推荐12个超实用的Visual Studio插件

程序员:这10种糟糕的程序命名,你遇到过几个?

使用Vistual Studio N年,推荐2个异常捕获的技巧

面试官:你连RESTful都不知道我怎么敢要你?

程序员:我终于知道post和get的区别

居然不知道&和&&的区别?

之前在实际工作中,遇到过这样的问题,异步获取 GPS 定位信息。一个实际的问题出现了,在第一次定位的时候一般时间都比较长,现在的要做的是,当超出一定的时间,就提醒用户。

那么如何实现异步等待任务并在超时时进行一定的处理呢?

Task 的实例方法 Wait

public bool Wait(int millisecondsTimeout, CancellationToken cancellationToken);
public bool Wait(int millisecondsTimeout);
public bool Wait(TimeSpan timeout);
public void Wait();
public void Wait(CancellationToken cancellationToken);

Wait 方法所支持的的特点:一个是取消任务,一个是超时。但是不可避免的是阻塞线程,一般在主线程中(UI 线程)是要避免耗时任务的。如果真要去等待获取定位信息的 Task,会不可避免地卡住界面,用户体验不够良好。

Task 的静态方法

Task.When** 可等待多个异步任务,不阻塞线程,所以可以利用 Delay 静态方法“间接”实现异步超时的处理,非阻塞的方式!

var resultTask = Task.WhenAny(task, Task.Delay(timeout))

我们再 WhenAny 方法中代入两个 task 参数:源 task、新建的延迟的 task(ps:即超时的时间 task),再得到 resultTask。

// 摘要:任何提供的任务已完成时,创建将完成的任务。
// 参数:tasks:等待完成的任务。
// 返回结果:表示提供的任务之一已完成的任务。返回任务的结果是完成的任务。
public static Task<Task> WhenAny(params Task[] tasks);

异步 Task 实现超时处理的方法

Task.WhenAny(task, Task.Delay(timeout)),再比较这两个 Task 的执行先后。实现代码如下:

public static async Task<TResult> WaitAsync<TResult>(Task<TResult> task, TimeSpan timeout){if (await Task.WhenAny(task, Task.Delay(timeout)) == task){//指定时间内完成的处理return await task;}else{//超时处理throw new TimeoutException("The operation has timed out.");}}

思考

上述方法所实现的等待一个获取 gps 的耗时任务,是没有任何问题的。并不会产生性能、卡界面等问题,但是如果在源 task(ps:执行获取 gps 的 task),在超时到期之前完成,则不会取消在 Task.Delay 调用中启动的内部计时器作业。当调用多次该方法时,“僵尸”计时器作业的数量变得越来越大时。性能可能会受到影响

相关链接

https://devblogs.microsoft.com/pfxteam/crafting-a-task-timeoutafter-method/

https://stackoverflow.com/questions/4238345/asynchronously-wait-for-taskt-to-complete-with-timeout

参考资料

[1]

Task.ContinueWith: http://msdn.microsoft.com/en-us/library/dd270696.aspx

[2]

Task.Wait: http://msdn.microsoft.com/en-us/library/dd235606.aspx

推荐阅读

面试分享昨天面试5道有意思的题目

汇总2019我的公众号回顾

原创2019年还剩1天,我从外包公司离职了

抢票12306崩了,90%的人都用过这三款抢票工具

作死博客园刷粉丝启示录

工具程序员必装的10款谷歌插件

技巧99%的人不知道搜索引擎的6个技巧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/312404.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# WPF 表单更改提示

微信公众号&#xff1a;Dotnet9&#xff0c;网站&#xff1a;Dotnet9&#xff0c;问题或建议&#xff0c;请网站留言&#xff1b; 如果您觉得Dotnet9对您有帮助&#xff0c;欢迎赞赏Dotnet9.com内容目录实现效果业务场景编码实现本文参考源码下载1.实现效果未做修改的表单展示 …

2k 幻14_幻14、2020雷蛇潜行版、mbp、gs66等笔记本之间的选择??

题主再过一年要出国学习&#xff0c;现在想换一台比较全能的本子&#xff0c;有一定续航能力&#xff0c;做工不能太差&#xff0c;经的起三四年的使用但也希望能打打游戏&#xff0c;求助各位帮忙。预算15000以下&#xff0c;有别的推荐也可以先分析下优缺点&#xff1a;幻14&…

XRPC接口双向调用

一般远程接口调用的服务都是基于客户端主动调用服务端&#xff0c;由服务端来提供相关的接口服务&#xff1b;在新版本的XRPC中引入了一个新的功能&#xff0c;即接口双向通讯&#xff0c;组件提供服务创建客户会话的接口代理并调用客户提供的接口服务。接下来介绍如何通过XRPC…

电机控制pid_微电机控制如此简单,揭秘微电机调速的控制,PID控制之双环调速...

​​在微型电机应用中&#xff0c;由于各种应用产品的不同会用到不同的调速方式&#xff0c;在调速中可能会遇到各种不同的问题&#xff0c;下面天孚电机对最近客户对微电机PID调速遇到的双环控制问题来讲一讲。智能小车TFMOTOR-N30减速电机​客户是做智能小车的采用的是tfn30微…

简单的01背包和完全背包

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 01背包&#xff08;每种物品只能使用一次&#xff09;&#xff1a; //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n,m,v[1010],w[1010],dp[1010]; int…

图片上传组件_配置Django-TinyMCE组件 实现上传图片功能

Django自带的Admin后台&#xff0c;好用&#xff0c;TinyMCE作为富文本编辑器&#xff0c;也蛮好用的&#xff0c;这两者结合起来在做博客的时候很方便&#xff08;当然博客可能更适合用Markdown来写&#xff09;&#xff0c;但是Django-TinyMCE这个组件默认没有图片上传功能的…

.NET Core 3.1之深入源码理解HealthCheck(二)

写在前面前文讨论了HealthCheck的理论部分&#xff0c;本文将讨论有关HealthCheck的应用内容。可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。运行状况检查可以测试应用的依赖项&#xff08;如数据库和外部服务终结点&#xff09;以确认是否可用和…

多重背包问题以及二进制优化

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 多重背包问题&#xff08;N< 100): //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n,m,dp[110]; int main() {cin>>n>>m;for(int i0;i&…

UnitTest in .NET(Part 2)

Photo &#xff1a;Unit Test in Visual Studio文 | Edison Zhou上一篇我们学习基本的单元测试基础知识和入门实例。但是&#xff0c;如果我们要测试的方法依赖于一个外部资源&#xff0c;如文件系统、数据库、Web服务或者其他难以控制的东西&#xff0c;那又该如何编写测试呢&…

vilatile 深入理解java虚拟机_深入理解Java虚拟机(jvm性能调优+内存模型+虚拟机原理)...

本套课程从虚拟机的发展历史&#xff0c;虚拟机的内存结构&#xff0c;对象的分配与回收以及字节码&#xff0c;类加载等多个方面深入地对Java虚拟机进行了剖析。内容详实&#xff0c;语言通俗易懂。理论结合实践&#xff0c;让学习本套视频的朋友可以更快的理解虚拟机的原理&a…

二维费用的背包问题

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n, v, m, dp[120][120];int main() {cin >> n >> v >> m;for (int i 0; i < n; i) …

UnitTest in .NET(Part 1)

Photo &#xff1a;Unit Test in Visual Studio文 | Edison Zhou2015年看了Roy Osherove的《单元测试的艺术》一书&#xff0c;颇有收获。因此&#xff0c;我在当时就将我的学习笔记过程记录了下来&#xff0c;并分为四个部分分享成文&#xff0c;与各位Share。本篇作为入门&am…

找出一个字符串中出现次数最多的字_Day34:第一个只出现一次的字符

剑指Offer_编程题——第一个只出现一次的字符题目描述&#xff1a;在一个字符串(0<字符串长度<10000&#xff0c;全部由字母组成)中找到第一个只出现一次的字符&#xff0c;并返回它的位置&#xff0c;如果没有则返回-1&#xff0c;需要区分大小写。(从0开始计数)。具体要…

2020 WTM 继续向前

WTM3.1 正式发布在过去的2019年&#xff0c;承蒙各位的厚爱&#xff0c;WTM从零开始一年的时间在GitHub上收获了将近1600星&#xff0c;nuget上的下载量累计超过10万。WTM所坚持的低码开发&#xff0c;快速实现的理念受到了越来越多.netcore使用者的喜爱。在2020年&#xff0c;…

autowired用在static_java – @Autowired和static方法

您可以通过以下解决方案之一来实现此目的&#xff1a;使用构造函数Autowired这种方法将构造需要一些bean作为构造函数参数的bean。在构造函数代码中&#xff0c;设置静态字段的值为参数为构造函数执行。样品&#xff1a;Componentpublic class Boo {private static Foo foo;Aut…

使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

什么样的HTTP方法是安全的&#xff1f; 如果一个方法不会改变资源的表述&#xff0c;那么这个方法就被认为是安全的。 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的&#xff0c;但需要注意的是&#xff0c;这并不意味着执行GET请求就不会引起其它的资源操作&#xff0c;在表面…

混合背包问题

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2020.12.31 #include <iostream> using namespace std; #include <vector>struct note {int kind;int v, w; };vector <note> kinds; int n, v, v1, w, dp…

.NET Core 3.1通用主机原理及使用

一、前言只是讲asp.net core 3.x通用主机的大致原理&#xff0c;这些东西是通过查看源码以及自己根据经验总结得来的&#xff0c;在文章中不会深入源码&#xff0c;因为个人觉得懂原理就晓得扩展点&#xff0c;后期碰到有需求的时候再仔细去研究源码也不迟。阅读前你应该先去了…

火焰效果材质实现_「游戏开发」使用Unity实现魔法火焰效果

*本文转载自公众号“Unity官方平台”。本文由视觉效果艺术家Evgeny Starostin分享如何使用Unity制作魔法火焰效果的过程&#xff0c;让我们一起学习和制作魔法火焰吧。下面是魔法火焰效果图。项目下载本文提供项目工程及着色器下载。本文为转载文章&#xff0c;请关注公众号“U…

激光炸弹(二维前缀和问题)

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2021.1.2 #include <iostream> using namespace std; const int N 5010; int mp[N][N]; int main() {int n,m,k,r,x,y,w;cin>>k>>r;r min(r,5001);n m …