如何设计网站风格/专业搜索引擎seo服务
最近在开发过程中遇到了一个问题,在进行通讯连接时,如果没有连接的话会延时几十秒,而且还设置不了连接超时时间,于是我就想着有没有一种可以判断这个方法的执行时间超过多少秒,就跳出执行其他方法,经过大量搜索,找到了几种方法,基本上都是以循环来判断实现的,也有一种直接设置方法执行时间的,因为我的遇到的问题比较少见,所以用了第三种不常见的方法来实现,大家可以根据自己的需求来选择。
一、异步方法场景(使用 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,以 管理员身…...

js循环导出多个word表格文档
文章目录 js循环导出多个word表格文档一、文档模板编辑二、安装依赖三、创建导出工具类exportWord.js四、调用五、效果图js循环导出多个word表格文档 结果案例: 一、文档模板编辑 二、安装依赖 // 实现word下载的主要依赖 npm install docxtemplater pizzip --save// 文件操…...

Spring Boot 日志 配置 SLF4J 和 Logback
前言 在开发 Java 应用时,日志记录是不可或缺的一部分。日志可以记录应用的运行状态、错误信息和调试信息,帮助开发者快速定位和解决问题。Spring Boot 项目默认集成了 SLF4J 和 Logback,使得日志配置变得简单而灵活。本文将详细介绍如何在 …...

企业级包管理器:专栏概述 (1)
在当今的前端开发领域,包管理器已经成为了每一位开发者不可或缺的工具。它们就像一个个神奇的工具箱,里面装满了各种各样的工具(即软件包),帮助我们快速搭建项目、实现功能,极大地提高了开发效率。接下来&a…...

【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包
STM32-MBD(1)安装 STM32 硬件支持包 【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包 1. 必须的软硬件条件2. 嵌入式硬件支持包2.1 Embedded Coder2.2 嵌入式硬件支持包2.3 Embedded Coder Support Package for STMicroelec…...

书后习题答案:《Python程序设计基础(第2版)》,电子工业出版社,2020.01
【持续更新】 第3章 from math import *x1 float(input("请输入x1: ")) # print(x1) x2 float(input("请输入x2: ")) y1 float(input("请输入y1: ")) y2 float(input("请输入y2: "))dis sqrt(pow(x1 - x2, 2) pow(y1 - y2, 2))…...

Qt之第三方库QXlsx使用(三)
Qt开发 系列文章 - QXlsx(三) 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…...

Python通过global实现多文件共享全局参数,方法
Python通过global实现多文件共享全局参数 global关键字,全局变量 基础用法 这种用法,不能在其他的py文件中使用, x 6 def func():global x #定义外部的xx 10 func() print (x) #输出10共享参数 新建glo.py文件(全局变量文件)…...

DevOps工程技术价值流:项目构建工具的选择与实践
在快速迭代的软件工程领域,项目构建工具扮演着举足轻重的角色。它们不仅自动化了构建、测试、打包和部署等关键环节,还显著提升了开发效率和质量。本文将深入探讨后端常用的Maven和Gradle,以及前端不可或缺的NPM,并重点对比Maven与…...

【数据库】复习
数据库期中复习——概念填空_在修改数据结构时,为了保证数据库的数据独立性-CSDN博客 选择题 关系数据理论-数据库习题_数据库关系理论考题-CSDN博客 关系、关系模式、关系模型区别和联系 关系:元组的集合,一张表 关系模式:关系的描述 R(…...

CorsConfig前后端数据跨域连接,IDEA右侧Maven窗口消失
前后端数据跨域连接(分页查询并显示) 一、后端添加分页查询 分页查询核心就是:每页需要显示多少条记录(pageSize),当前查看第几页(pageNum);MySQL提供了分页函数limit m,n select * from table limit (pageNum-1)*pageSize, pa…...