C# 异步方法async / await 任务超时处理

一、需求

如果调用一个异步方法后,一直不给返回值结果怎么办呢?这就涉及到怎么取消任务了。

二、Task取消任务

 static CancellationTokenSource source = new CancellationTokenSource();static void Main(string[] args){Task.Run(() =>{for (int i = 0; i < 10; i++){Thread.Sleep(500);Console.WriteLine("oh my god");source.Token.ThrowIfCancellationRequested();}}, source.Token);Thread.Sleep(2000);Console.WriteLine("取消任务");source.Cancel();Console.ReadKey();}

换一个写法

static void Main(string[] args){bool isOut = false;var task1 = Task.Run(() =>{for (int i = 0; i < 100; i++){if (isOut) return;Console.WriteLine("执行中" + i);Thread.Sleep(500);}});Thread.Sleep(2000);Console.WriteLine("取消任务");isOut = true;Console.ReadKey();}

 我在 for 循环中加入一个判断,如果等于 true,直接跳出循环,这不也可以中断任务

三、Task取消任务的回调

取消任务也是可以加入回调的,如下:

 static CancellationTokenSource source = new CancellationTokenSource();static void Main(string[] args){var task1 = Task.Run(() =>{for (int i = 0; i < 100; i++){source.Token.ThrowIfCancellationRequested();Console.WriteLine("执行中" + i);Thread.Sleep(500);}}, source.Token);//在指定的毫秒数后取消task执行source.CancelAfter(2 * 1000);//取消任务后的回调source.Token.Register(() =>{//不延迟会获取不到正确的状态Thread.Sleep(50);Console.WriteLine("task1状态:" + task1.Status);Console.WriteLine("IsFaulted状态:" + task1.IsFaulted);//由于未处理的异常,任务已完成。Console.WriteLine("IsCompleted状态:" + task1.IsCompleted);//获取一个值,该值指示任务是否已完成。});Console.ReadKey();}

四、Task超时处理的实现

先来一个超时取消后续代码执行的方法

 private static CancellationTokenSource Cancellation = new CancellationTokenSource();static void Main(string[] args){//设置超时的时间Cancellation.CancelAfter(TimeSpan.FromSeconds(1));Task.Run(() =>{try{Console.WriteLine("方法执行开始");//异步 Task.Delay 可以这么写,await Task.Delay(3000, Cancellation.Token)//效果同 Cancellation.Token.ThrowIfCancellationRequested() //await Task.Delay(3000, Cancellation.Token);Thread.Sleep(2000);Cancellation.Token.ThrowIfCancellationRequested();Console.WriteLine("方法执行结束");}catch (OperationCanceledException){Console.WriteLine("取消操作");}});Console.ReadKey();}

可以看到,方法执行结束这段代码并没有打印,这就是我们想要的效果了,在上面我们设置的超时时间是1秒,在后面的执行中,使用了线程睡眠时间是2秒,超时后,就自动取消操作了

把超时时间改为3秒,看看效果

private static CancellationTokenSource Cancellation = new CancellationTokenSource();
static void Main(string[] args)
{//设置超时的时间Cancellation.CancelAfter(TimeSpan.FromSeconds(3));Task.Run(() =>{try{Console.WriteLine("方法执行开始");//异步 Task.Delay 可以这么写,await Task.Delay(3000, Cancellation.Token)//效果同 Cancellation.Token.ThrowIfCancellationRequested() //await Task.Delay(3000, Cancellation.Token);Thread.Sleep(2000);Cancellation.Token.ThrowIfCancellationRequested();Console.WriteLine("方法执行结束");}catch (OperationCanceledException){Console.WriteLine("取消操作");}});Console.ReadKey();}

这回就没有取消任务的执行了,那么超时取消代码执行的效果就实现了。

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

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

相关文章

Responder工具

简介 Responder是一种网络安全工具&#xff0c;用于嗅探和抓取网络流量中的凭证信息&#xff08;如用户名、密码等&#xff09;。它可以在本地网络中创建一个伪造的服务&#xff08;如HTTP、SMB等&#xff09;&#xff0c;并捕获客户端与该服务的通信中的凭证信息。 Responder工…

路由器作为网络扩展器——设置桥接、路由模式

下面提到的路由器都是家用路由器 一、有线桥接(交换模式) 1.连接示意图 (副路由器只看交换模式部分) 副路由器充当交换机的角色 二、无线桥接(与有线类似) &#xff08;副路由器的无线信号 连接 主路由器的无线信号&#xff09; 三、路由模式 1.连接示意图 (副路由器只看…

扩散模型条件生成——Classifier Guidance和Classifier-free Guidance原理解析

1、前言 从讲扩散模型到现在。我们很少讲过条件生成&#xff08;Stable DIffusion曾提到过一点&#xff09;&#xff0c;所以本篇内容。我们就来具体讲一下条件生成。这一部分的内容我就不给原论文了&#xff0c;因为那些论文并不只讲了条件生成&#xff0c;还有一些调参什么的…

【时序约束】一些关于io输入输出时序约束的实际的参考示例1

在FPGA设计中&#xff0c;I/O输入输出时序约束是确保信号完整性和时序准确性的重要步骤。以下是一些实际的参考示例&#xff0c;展示了如何使用set_input_delay和set_output_delay命令&#xff0c;并提供了如何确定具体约束值的方法。 示例 示例1&#xff1a;输入时序约束 假…

Java数据结构与算法(最大子数组和动态规划)

前言 动态规划主要用于解决具有重叠子问题和最优子结构性质的问题。它通过将问题分解为子问题来解决复杂问题&#xff0c;每个子问题仅解决一次&#xff0c;并将其结果存储&#xff0c;以供后续使用&#xff0c;从而避免了重复计算。 对应leetcode. - 力扣&#xff08;LeetCo…

Linux统计目录和文件数目

当在终端执行 ls | wc 命令时&#xff0c;ls 命令列出了当前目录中的文件和目录&#xff0c;然后通过管道 | 将输出传递给 wc 命令进行计数。 wc 命令的默认输出包括三列&#xff1a; 行数&#xff08;lines&#xff09;&#xff1a;这通常是文件和目录的总数&#xff0c;但注…

【python】python电影评论数据抓取分析可视化(源码+数据+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

PVc是k8s的什么?

**PVC&#xff08;PersistentVolumeClaim&#xff09;是Kubernetes&#xff08;k8s&#xff09;中的持久化存储卷声明**。它是用户对存储的请求&#xff0c;类似于Pod消耗节点资源的方式&#xff0c;PVC则消耗PV&#xff08;Persistent Volume&#xff0c;持久化卷&#xff09;…

探索教研在线平台的系统架构

教研在线平台作为一家致力于教育技术领域的企业&#xff0c;其系统架构扮演着至关重要的角色。本文将深入探讨教研在线平台的系统架构&#xff0c;从技术架构、数据架构和安全架构等方面进行分析&#xff0c;以期帮助读者更好地理解这一教育科技平台的运作模式。 技术架构是教研…

银河麒麟操作系统通过首批软件供应链安全能力认证

麒麟软件产品供应链安全能力获双重肯定&#xff01;5月30日&#xff0c;经北京赛迪认证中心评估&#xff0c;银河麒麟高级服务器操作系统V10和银河麒麟桌面操作系统V10成为首批获得软件供应链安全能力认证产品&#xff0c;并在操作系统类产品中名列前茅。 软件供应链安全能力评…

常用的国内外公共DNS服务

DNS介绍 DNS&#xff08;全称&#xff1a;Domain Name Service&#xff0c;域名系统&#xff09;&#xff0c;是互联网的核心服务之一&#xff0c;将便于记忆的网址&#xff08;域名&#xff09;和不便记忆的IP地址相互对应&#xff0c;方便普通用户更便捷地访问互联网。 通常…

MP4文件格式

ISO 协议族 ISO/IEC-14496:MPEG-4 协议族,包括 ISO 容器格式、MPEG-4(H.264)视频压缩标准等。ISO/IEC-23008:MPEG-H 协议族,包括 H.265(HEVC)视频压缩标准等。字段类型含义ISO/IEC-14496-1SystemMPEG-4 的复用、同步等系统级特性ISO/IEC-14496-2Video视频压缩标准ISO/I…

一些JVM面试题

Java垃圾回收器的原理 有三对常见的垃圾回收器&#xff1a; 在JDK1.8之前&#xff0c;有三种常见的垃圾回收器&#xff0c; serial serialOld 串行化的垃圾回收 PS PO 多线程并行回收&#xff0c;可以动态调整堆内存的大小&#xff0c;关注系统的吞吐量 ParNew CMS Par…

getifaddrs 函数详解

getifaddrs 函数用于获取系统中所有网络接口的信息。它返回一个链表&#xff0c;链表中的每个节点包含一个 struct ifaddrs 结构&#xff0c;该结构定义在 ifaddrs.h 头文件中。下面是关于 getifaddrs 函数和 struct ifaddrs 结构的详细解析&#xff1a; 1. getifaddrs 函数 …

Github 2024-06-07开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-07统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目3C++项目3JavaScript项目2Jupyter Notebook项目1TypeScript项目1Vue项目1比特币核心:开源比特币软件 创建周期:4919 天开发语言:C…

09-spring的bean创建流程(一)

文章目录 spring中bean的创建流程finishBeanFactoryInitialization(beanFactory)beanFactory.preInstantiateSingletons();getMergedLocalBeanDefinition(beanName);流程实现FactoryBean接口,里面的对象实例化过程 spring中bean的创建流程 finishBeanFactoryInitialization(be…

HPUX系统Oracle RAC如何添加ASM磁盘

前言 HPUX简介 HP-UX (Hewlett-Packard Unix) 是惠普公司开发的类 Unix 操作系统。自 1980 年代问世以来&#xff0c;HP-UX 在技术和功能上不断发展&#xff0c;适应了多种硬件平台和企业计算需求。以下是 HP-UX 的发展历史概述&#xff1a; 1980 年代&#xff1a;起源与早期…

webflux 拦截器验证token

在WebFlux中&#xff0c;我们可以使用拦截器&#xff08;Interceptor&#xff09;来验证Token。以下是一个简单的示例&#xff1a; 1. 首先&#xff0c;创建一个名为TokenInterceptor的类&#xff0c;实现HandlerInterceptor接口&#xff1a; java import org.springframewor…

【Unity UGUI】Screen.safeArea获取异形屏数据失败

Screen.safeArea获取不到异形屏的尺寸位置等数据 检查AndroidManifest.xml文件是否有设置&#xff1a;android:theme"style/UnityThemeSelector"&#xff0c;没有加上即可 android:theme"style/UnityThemeSelector"

【学习笔记】Windows GDI绘图(十二)双缓冲管理(用GIF动画测试)

文章目录 引言默认双缓冲SetStyle 手动管理双缓冲图形BufferedGraphicsManager缓冲图形管理器BufferedGraphicsContext 缓冲图形上下文BufferedGraphics 图形缓冲区验证双缓冲的效果(Gif动画显示非正常速度)结束语性能对比 引言 图形编程中一个常见的问题就是闪烁&#xff0c;…