C# 设置方法执行超时,则执行下一个方法
最近在开发过程中遇到了一个问题,在进行通讯连接时,如果没有连接的话会延时几十秒,而且还设置不了连接超时时间,于是我就想着有没有一种可以判断这个方法的执行时间超过多少秒,就跳出执行其他方法,经过大量搜索,找到了几种方法,基本上都是以循环来判断实现的,也有一种直接设置方法执行时间的,因为我的遇到的问题比较少见,所以用了第三种不常见的方法来实现,大家可以根据自己的需求来选择。
一、异步方法场景(使用 Task 和 CancellationToken)
当处理异步方法时,借助 CancellationToken 来实现超时控制并在超时时执行下一个方法是一种比较常用且规范的做法,示例代码如下:
using System;
using System.Threading;
using System.Threading.Tasks;class Program
{static async Task Main(){// 设置超时时间对应的CancellationTokenSource,这里假设超时时间为3秒,可按需调整CancellationTokenSource cts = new CancellationTokenSource(3000); try{await DoFirstAsync(cts.Token);}catch (OperationCanceledException){Console.WriteLine("第一个方法执行超时,开始执行下一个方法");await DoNextAsync();}Console.ReadLine();}static async Task DoFirstAsync(CancellationToken cancellationToken){// 模拟一个耗时的异步操作,比如网络请求、长时间的文件读取等// 这里使用Task.Delay来模拟耗时操作,实际中替换为真实业务逻辑await Task.Delay(5000, cancellationToken); }static async Task DoNextAsync(){Console.WriteLine("正在执行下一个方法...");// 在这里添加下一个方法具体要做的业务逻辑,比如进行其他的数据处理、发起新的请求等await Task.CompleteTask;}
}
在上述代码中:
- 设置超时机制:
首先创建了 CancellationTokenSource 实例,并在构造函数中传入超时时间(以毫秒为单位,这里设置为 3000 毫秒即 3 秒),通过它可以获取 CancellationToken,这个令牌用于在异步操作中传递取消信号。 - 执行第一个异步方法:
在 DoFirstAsync 方法中,模拟了一个耗时 5 秒的异步操作(通过 Task.Delay(5000, cancellationToken)),同时传递了 CancellationToken。如果在这个异步操作执行过程中,超时时间到了(也就是 3 秒后),CancellationToken 会触发取消操作,使得 Task.Delay 抛出 OperationCanceledException 异常,进而导致 DoFirstAsync 方法停止执行。 - 捕获异常并执行下一个方法:
在 Main 方法中,使用 try-catch 块捕获 OperationCanceledException 异常,一旦捕获到,表示第一个方法执行超时了,此时会输出相应提示信息,并接着执行 DoNextAsync 方法,也就是开始执行下一个方法。
二、同步方法场景(使用 Stopwatch 类)
对于同步方法,可以利用 Stopwatch 类来记录方法执行的时间,通过不断判断是否超时来决定是否结束当前方法执行并转去执行下一个方法,示例如下:
using System;
using System.Diagnostics;class Program
{static void Main(){DoFirst();DoNext();Console.ReadLine();}static void DoFirst(){Stopwatch stopwatch = new Stopwatch();stopwatch.Start();while (true){// 模拟同步方法中的一些操作,这里简单输出内容,实际中替换为真实业务逻辑Console.WriteLine("正在执行第一个方法...");if (stopwatch.Elapsed.TotalSeconds >= 3){Console.WriteLine("第一个方法执行超时,开始执行下一个方法");break;}System.Threading.Thread.Sleep(500);}stopwatch.Stop();}static void DoNext(){Console.WriteLine("正在执行下一个方法...");// 在这里添加下一个方法具体要做的业务逻辑,例如对数据进行处理、计算等操作for (int i = 0; i < 10; i++){Console.WriteLine($"下一个方法中的操作:{i}");}}
}
在这个示例中:
- 使用 Stopwatch 计时:
在 DoFirst 方法中,先创建并启动 Stopwatch 实例来记录时间,然后进入一个循环模拟方法的执行过程(这里只是简单地输出一些内容,实际应用中替换为真实的业务逻辑操作)。 - 判断超时并结束当前方法:
在每次循环中,通过 stopwatch.Elapsed.TotalSeconds >= 3 判断是否已经超过了设定的超时时间(这里假设为 3 秒,可按需调整),如果超过了,就输出提示信息并通过 break 跳出循环,结束 DoFirst 方法的执行。 - 执行下一个方法:
当 DoFirst 方法结束后,就会接着执行 DoNext 方法,也就是执行下一个需要执行的方法,在 DoNext 方法中可以添加具体的业务逻辑操作。
三、基于委托和 BeginInvoke/EndInvoke 的方式(较老但仍可用的异步模式)
在早期的 C# 异步编程中,可以使用委托的 BeginInvoke 和 EndInvoke 方法来实现类似的超时控制及后续操作,不过现在基于任务的异步模式更为常用,以下是示例代码供参考:
using System;
using System.Threading;class Program
{static void Main(){// 创建一个委托,指向要执行的第一个方法Action firstAction = DoFirst;// 开始异步调用第一个方法,并获取IAsyncResult对象用于后续操作IAsyncResult asyncResult = firstAction.BeginInvoke(null, null);// 设置超时时间,这里假设为3秒,单位是毫秒int timeout = 3000;bool completed = asyncResult.AsyncWaitHandle.WaitOne(timeout);if (completed){// 如果在超时时间内完成,获取结果(这里没有返回值所以不需要接收具体结果)firstAction.EndInvoke(asyncResult);}else{Console.WriteLine("第一个方法执行超时,开始执行下一个方法");DoNext();}Console.ReadLine();}static void DoFirst(){// 模拟操作,这里简单输出一些内容,实际替换为真实业务逻辑for (int i = 0; i < 10; i++){Console.WriteLine("正在执行第一个方法..." + i);Thread.Sleep(500);}}static void DoNext(){Console.WriteLine("正在执行下一个方法...");// 在这里添加下一个方法具体要做的业务逻辑,如数据处理等for (int i = 0; i < 5; i++){Console.WriteLine($"下一个方法中的操作:{i}");}}
}
在上述代码中:
- 委托异步调用:
首先创建一个 Action 类型的委托,指向要执行的第一个方法 DoFirst,然后通过 BeginInvoke 方法发起异步调用,并获取到 IAsyncResult 对象,这个对象用于后续判断异步操作是否完成等操作。 - 设置超时判断:
设定了超时时间(这里为 3000 毫秒即 3 秒),通过 asyncResult.AsyncWaitHandle.WaitOne(timeout) 来等待异步操作完成,这个方法会返回一个 bool 值,如果在超时时间内操作完成则返回 true,否则返回 false。 - 根据超时情况执行相应操作:
如果返回 true,表示在超时时间内第一个方法执行完成了,此时通过 EndInvoke 方法来结束异步调用(如果方法有返回值的话可以在这里获取返回值);如果返回 false,说明执行超时了,就会输出提示信息并执行 DoNext 方法,也就是执行下一个方法。
这些不同的实现方式可以满足不同的编程场景需求,你可以根据实际的代码结构、方法的同步或异步特性等来选择合适的方式来实现方法执行超时后执行下一个方法的功能。
小白路漫漫,让我们一起加油!!!
相关文章:
C# 设置方法执行超时,则执行下一个方法
最近在开发过程中遇到了一个问题,在进行通讯连接时,如果没有连接的话会延时几十秒,而且还设置不了连接超时时间,于是我就想着有没有一种可以判断这个方法的执行时间超过多少秒,就跳出执行其他方法,经过大量…...

【iOS】UIImagePickerController
【iOS】UIImagePickerController 前言 笔者简单学习了iOS开发如何调用本地的一个相册的内容,下面简单介绍一下相关内容。 介绍 UIImagePickerController是iOS平台上的一个类,用于在应用程序中访问设备的照片库、相机和视频录制功能。它提供了一个用户…...

现代企业营销模式创新:链动 2+1 模式 AI 智能名片商城小程序的应用与价值
摘要:本文旨在探讨现代企业面临的客户环境变化以及相应的营销模式变革需求,重点分析链动 21 模式 AI 智能名片商城小程序在满足现代企业营销沟通即时性、精准性、社会性和方便性要求方面的作用,并阐述其对企业在未来市场竞争中取得胜利的重要…...

springboot+Loki+Loki4j+Grafana搭建轻量级日志系统
文章目录 前言一、日志组件介绍 1.1 Loki组件1.2 Loki4j组件1.3 Grafana 二、组件下载安装运行 Loki下载安装运行Grafana下载安装运行 三、创建springboot项目总结 前言 日志在任何一个web应用中都是不可忽视的存在,它已经成为大部分系统的标准组成部分。搭建日志…...

服务器守护进程化
目录 一、守护进程的定义与特点 1、定义 2、特点 二、守护进程的原理 三、守护进程与会话(Session)的关系 四、C实现守护进程 守护进程(Daemon Process)是一个在后台运行、通常不与用户直接交互的进程。守护进程是操作系统中…...

灵途科技亮相2024世界传感器大会 分享光纤光源技术突破
12月1日至2日,2024世界传感器大会(WSS)在郑州国际会展中心隆重举办,泛自动驾驶领域光电感知专家灵途科技受邀参加“光纤传感器与激光雷达”分论坛,并在大会上带来《激光雷达用一体化光纤光源》专题演讲,同与…...
day35—蓝桥杯2024年第16届校赛模拟第二期-T4(最小花费)
【问题描述】 小蓝有一个整数,初始值为 1 ,他可以花费一些代价对这个整数进行变换。 小蓝可以花费 1 的代价将整数增加 1 。 小蓝可以花费 3 的代价将整数增加一个值,这个值是整数的数位中最大的那个(1 到 9)。 小蓝可…...

【CSS in Depth 2 精译_068】11.2 颜色的定义(下):CSS 中的各种颜色表示法简介
当前内容所在位置(可进入专栏查看其他译好的章节内容) 第四部分 视觉增强技术 ✔️【第 11 章 颜色与对比】 ✔️ 11.1 通过对比进行交流 11.1.1 模式的建立11.1.2 还原设计稿 11.2 颜色的定义 11.2.1 色域与色彩空间11.2.2 CSS 颜色表示法 ✔️ 11.2.2.…...

游戏引擎学习第38天
仓库: https://gitee.com/mrxiao_com/2d_game 回顾上次的内容。 我们之前讨论了将精灵放在屏幕上,但颜色错误的问题。问题最终查明是因为使用了一个调整工具,导致文件的字节顺序发生了变化。重新运行“image magic”工具对一些大图像进行重新处理后&am…...
P1223 排队接水(贪心)
题目描述 有 𝑛个人在一个水龙头前排队接水,假如每个人接水的时间为 𝑇𝑖,请编程找出这 𝑛 个人排队的一种顺序,使得 𝑛个人的平均等待时间最小。 输入格式 第一行为一个整数 &am…...

关于springBoot+vue项目中配置SSL证书问题
前端可以通过https进行访问 1.前端在访问后端接口时,使用https进行访问,在request.js配置文件中,这个文件是配置axios的基本请求的,在基础请求地址中改为https方式 2.需要在Linux中的nginx中配置ssl证书,具体请参考&…...

GUI的最终选择:Tkinter
Tkinter是Python默认的GUI库,因此使用时直接导入即可:import tkinter 17.1 Tkinter之初体验 代码分析: tkinter.mainloop()通常是程序的最后一行代码,执行后程序进入主事件循环。 17.2 进阶版本 将代码封装成类: 运…...
Photohop关于数位板没有压力感,PS画笔的钢笔压力总是显示感叹号的问题解放方法
(实际我只用到红色字2步解决了问题,但为了兼顾更多朋友,还是把其他步骤详细完善) 一,先确定数位板正常链接电脑,并安装好驱动,并在驱动测试到压力 二,解决PS前感叹号问题 …...
rust websocket Echo server高性能服务器开发
最近在学习websocket时,一直没有发现好的websocket server工具来调试,于是就自己做了一个websocket server用来学习和调试。因为rust性能遥遥领先,所以就采用了rust来搭建服务器。废话不多说直接上代码main.rs: use tokio::net::TcpListener; use tokio_tungstenite::tung…...
19、网络编程:
19、网络编程: 网络的相关概念: 网络通讯: 概念:两台设备之间通过网络实现数据传输;网络通讯:将数据通过网络从一台设备传输到另一台设备;java.net包下提供了一系列的类或接口,供…...

[代码随想录11]栈和队列的应用,逆波兰表达式求值 、滑动窗口最大值、前 K 个高频元素
前言 这几个题目都是栈和队列的高频面试题目,主要是考察思路和coding能力,在前面几道题目的基础上进行延伸的。同时还有优先级队列和双端队列的用法 题目链接 150. 逆波兰表达式求值 - 力扣(LeetCode) 239. 滑动窗口最大值 - 力…...

认证插件介绍
本文档是针对 UOS 登录器插件给出开发指南,目的是为了让开发人员了解如何在 UOS 登录器上增加一种自定义认证方式,对插件接口做了详细说明以及实战练习。 文章目录 一、认证插件可以做什么?二、认证流程三、术语说明四、安全性五、可靠性六、…...

ASP.NET Core8.0学习笔记(二十四)——EF Core级联插入与删除
一、EF Core导航关系操作——级联插入 1.级联插入:在含有导航属性的实体(主体实体)中可以对实体进行级联插入。即在创建主体实体时直接把依赖实体进行赋值,此时只需要执行一次插入操作即可将主体实体与依赖实体同时入库。同时&am…...

Docker打包SpringBoot项目
一、项目打成jar包 在进行docker打包之前,先确定一下,项目能够正常的打成JAR包,并且启动之后能够正常的访问。这一步看似是可有可无,但是能避免后期的一些无厘头问题。 二、Dockerfile 项目打包成功之后,需要编写Doc…...
【Linux】WSL:Win运行Linux
WSL2(Windows Subsystem for Linux 2) 是 Microsoft 开发的技术,可在 Windows 系统上运行完整的 Linux 发行版环境。以下是详细的配置教程。 安装与配置 启用 WSL 功能 打开“开始”菜单,搜索 PowerShell,以 管理员身…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
浅谈不同二分算法的查找情况
二分算法原理比较简单,但是实际的算法模板却有很多,这一切都源于二分查找问题中的复杂情况和二分算法的边界处理,以下是博主对一些二分算法查找的情况分析。 需要说明的是,以下二分算法都是基于有序序列为升序有序的情况…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
LLaMA-Factory 微调 Qwen2-VL 进行人脸情感识别(二)
在上一篇文章中,我们详细介绍了如何使用LLaMA-Factory框架对Qwen2-VL大模型进行微调,以实现人脸情感识别的功能。本篇文章将聚焦于微调完成后,如何调用这个模型进行人脸情感识别的具体代码实现,包括详细的步骤和注释。 模型调用步骤 环境准备:确保安装了必要的Python库。…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
《Offer来了:Java面试核心知识点精讲》大纲
文章目录 一、《Offer来了:Java面试核心知识点精讲》的典型大纲框架Java基础并发编程JVM原理数据库与缓存分布式架构系统设计二、《Offer来了:Java面试核心知识点精讲(原理篇)》技术文章大纲核心主题:Java基础原理与面试高频考点Java虚拟机(JVM)原理Java并发编程原理Jav…...

【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...

【threejs】每天一个小案例讲解:创建基本的3D场景
代码仓 GitHub - TiffanyHoo/three_practices: Learning three.js together! 可自行clone,无需安装依赖,直接liver-server运行/直接打开chapter01中的html文件 运行效果图 知识要点 核心三要素 场景(Scene) 使用 THREE.Scene(…...