C# 中 SetTimeout 方案
近期项目中需在用户点击按钮后,延时执行代码逻辑,避免频繁操作。网上没找到有关 C# SetTimeout 官方API , 于是通过异步线程,动手实现一个。方案如下,如果同一个DelayedProcess 对象连续调用 SetTimeout 多次 ,默认取消前一次调用。
- public class DelayedProcess<Req,Rsp>
- {
- public delegate void ExcuteMethod(Result rsp);
- CancellationTokenSource tokenSource;
- public class Result {
- public Req request {
- get;
- set;
- }
- public Rsp response {
- get;
- set;
- }
- /// <summary>
- /// 抛出异常信息
- /// </summary>
- public Exception ex;
- /// <summary>
- /// 是否延时执行成功
- /// </summary>
- public bool IsSuccess {
- get;
- set;
- }
- }
- async void TaskDelay(int timeout, CancellationToken token, ExcuteMethod method, Result rsp)
- {
- try
- {
- await Task.Delay(timeout, token);
- rsp.IsSuccess = true;
- rsp.ex = null;
- }
- catch (Exception ex)
- {
- rsp.ex = ex;
- rsp.IsSuccess = false;
- }
- finally {
- method(rsp);
- }
- }
- public void SetTimeout(int timeout, ExcuteMethod method, Result rsp)
- {
- Cancel();
- tokenSource = new CancellationTokenSource();
- TaskDelay(timeout, tokenSource.Token, method , rsp);
- }
- public void Cancel()
- {
- if (tokenSource != null && !tokenSource.IsCancellationRequested)
- {
- tokenSource.Cancel();
- }
- }
- }
调用示例:
- DelayedProcess<string, string> dp = new DelayedProcess<string, string>();
- private void button1_Click(object sender, EventArgs e)
- {
- Console.WriteLine("{0}:{1}", DateTime.Now, "开始请求");
- dp.SetTimeout(2000, (arg) => {
- if (arg.IsSuccess)
- {
- Console.WriteLine("{0}:延时执行{1}", DateTime.Now, arg.request);
- }
- else {
- Console.WriteLine("{0}:延时失败,{1}", DateTime.Now, arg.ex.Message);
- }
- }, new DelayedProcess<string, string>.Result() { request = "1111" });
- }
C# 中 SetTimeout 方案的更多相关文章
- js中settimeout方法加参数
js中settimeout方法加参数的使用. 简单使用看w3school 里面没有参数调用, 例子: <script type="text/javascript"> ...
- 此集合已经采用方案 http 的地址。此集合中每个方案中最多只能包含一个地址。
错误信息:此集合已经采用方案 http 的地址.此集合中每个方案中最多只能包含一个地址.如果服务承载于 IIS 中,则可以通过将“system.serviceModel/serviceHostingE ...
- js中setTimeout/setInterval定时器用法示例
js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...
- 【转】JS中setTimeout和setInterval的最大延时值详解
前言 JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.而这篇文中主要给大家介绍的是关于JS中setTi ...
- HDFS(0.20.2)运营中急救方案
这段时间折腾的都是hadoop和lucene,总结了hadoop在运营过程中出现问题时的解决方案,请大家指教! HDFS(0.20.2)运营中急救方案 1 Namenode 挂掉( ...
- 兼容性js中setTimeout 传参“保值”方案
这里所谓“保值”,是指在setTimeout中指定的时间后,执行指定的方法所用到的“参数”值,跟执行setTimeout时该“参数”值一样.是不是有点懵?看如下例子: ================ ...
- js中setTimeout()时间参数设置为0的探讨
起因源于一道前端笔试题: var fuc = [1,2,3]; for(var i in fuc){ setTimeout(function(){console.log(fuc[i])},0); co ...
- js中setTimeout()的使用bug
今天用setTimeout()时,遇到一个奇怪的现象,通过多方面的查询,最终解决了问题,这是setTimeout()设计的时候存在的一点点bug. 代码的作用主要是在三秒后自动关闭本浏览器窗口: 代码 ...
- FineReport集成到AWS系统中的方案
本人实施了北京炎黄盈动的BPM及OA系统,主要目标是对业务流程进行控制和管理,加快Oracle JDE的业务前端录单速度和弥补JDE在流程控制方面的不足,实现BPM数据能与JDE无缝互相结合,经过3个 ...
- Javascript中setTimeout()的用法详解
1.SetTimeOut() 1.1 SetTimeOut()语法例子 1.2 用SetTimeOut()执行Function 1.3 SetTimeout()语法 ...
随机推荐
- iview表单验证
iview表单验证的步骤 第一步:给 Form 设置属性 rules :rules="规则设置" 第二步:同时给需要验证的每个 FormItem 设置属性 prop 指向对应字段即 ...
- python 在一个文件夹的所有文件中查找关键字
python 在一个文件夹的所有文件中查找关键字 import os,shutil import re key='Hello' re_parttern=re.compile(r''+key,re.DO ...
- 【Nginx】优化,增加线程
https://blog.csdn.net/cnskylee/article/details/127645806 众所周知,Nginx一款体积小巧,但是性能强大的软负载,主要被用作后端服务和应用的反向 ...
- MyCat2 分表分库
1.添加数据库.存储数据源 我们在读写分离那边已经生成过,不需要在执行,如果没有执行过,执行下面注解,我们这边重新创建一个数据库db1 /*+ mycat:createDatasource{ &quo ...
- Mysql习题系列(三):单行函数
案例数据 提取码:2rd5 #[题目] # 1.显示系统时间(注:日期+时间) # 2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary) # 3.将员工的姓名按首字母排 ...
- 【C学习笔记】day4-2 求出0~999之间的所有“水仙花数”并输出。
2.求出0-999之间的所有"水仙花数"并输出."水仙花数"是指一个三位数,其各位数字的立方和确好等于该数本身,如:153=1+5+3?,则153是一个&quo ...
- [Unity]利用Mesh绘制简单的可被遮挡,可以探测的攻击指示器
最近做一个小游戏的Demo,最终的效果是这样的 主要是利用Mesh绘制三角形作为显示,然后使用后处理来制作探灯,注意,性能一般,仅仅适合小游戏 分为3步 1:利用mesh绘制三角形,原理很简单,利用三 ...
- uni小程序保存base64图片
使用uni.getFileSystemManager().writeFile去下载base64图片<view class="share-btn" @click="s ...
- DOM状态监听(观察者模式)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Oracle常用的日期操作函数 to_char()和to_date
https://www.cnblogs.com/zhangliang88/p/12924407.html