近期项目中需在用户点击按钮后,延时执行代码逻辑,避免频繁操作。网上没找到有关 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 方案的更多相关文章

  1. js中settimeout方法加参数

    js中settimeout方法加参数的使用. 简单使用看w3school  里面没有参数调用,  例子: <script type="text/javascript"> ...

  2. 此集合已经采用方案 http 的地址。此集合中每个方案中最多只能包含一个地址。

    错误信息:此集合已经采用方案 http 的地址.此集合中每个方案中最多只能包含一个地址.如果服务承载于 IIS 中,则可以通过将“system.serviceModel/serviceHostingE ...

  3. js中setTimeout/setInterval定时器用法示例

    js中setTimeout(定时执行一次)和setInterval(间隔循环执行)用法介绍. setTimeout:在指定的毫秒数后调用指定的代码段或函数:setTimeout示例代码 functio ...

  4. 【转】JS中setTimeout和setInterval的最大延时值详解

    前言 JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.而这篇文中主要给大家介绍的是关于JS中setTi ...

  5. HDFS(0.20.2)运营中急救方案

    这段时间折腾的都是hadoop和lucene,总结了hadoop在运营过程中出现问题时的解决方案,请大家指教! HDFS(0.20.2)运营中急救方案 1           Namenode 挂掉( ...

  6. 兼容性js中setTimeout 传参“保值”方案

    这里所谓“保值”,是指在setTimeout中指定的时间后,执行指定的方法所用到的“参数”值,跟执行setTimeout时该“参数”值一样.是不是有点懵?看如下例子: ================ ...

  7. js中setTimeout()时间参数设置为0的探讨

    起因源于一道前端笔试题: var fuc = [1,2,3]; for(var i in fuc){ setTimeout(function(){console.log(fuc[i])},0); co ...

  8. js中setTimeout()的使用bug

    今天用setTimeout()时,遇到一个奇怪的现象,通过多方面的查询,最终解决了问题,这是setTimeout()设计的时候存在的一点点bug. 代码的作用主要是在三秒后自动关闭本浏览器窗口: 代码 ...

  9. FineReport集成到AWS系统中的方案

    本人实施了北京炎黄盈动的BPM及OA系统,主要目标是对业务流程进行控制和管理,加快Oracle JDE的业务前端录单速度和弥补JDE在流程控制方面的不足,实现BPM数据能与JDE无缝互相结合,经过3个 ...

  10. Javascript中setTimeout()的用法详解

    1.SetTimeOut()       1.1 SetTimeOut()语法例子       1.2 用SetTimeOut()执行Function       1.3 SetTimeout()语法 ...

随机推荐

  1. [SWPUCTF 2021 新生赛]jicao

    CTF web安全 阅读代码可知当传入一个post型的参数id与wllmNB相等并且传入一个get型的参数json: 但是这里有一个函数json_decode,上网搜索可知json_decode这个函 ...

  2. windows server backup 无法使用或wbadmin.msc致命错误解决方法

    因为黑群辉断电无法自动引导进系统,我也找不到很好的办法,所以决定使用windows server来做NAS服务器,虽然都解决了内网穿透的问题,但是数据安全还在找方案,目前已经解决: 1.购买了一张pc ...

  3. linux备份系统

    转载csdn: Linux 中我该如何备份系统 - 京山游侠 - 博客园 (cnblogs.com)

  4. LeetCode-1220 统计元音字母序列的数目

    来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/count-vowels-permutation 题目描述 给你一个整数 n,请你帮忙统计一下我们 ...

  5. Google Webstore Config

    1.使用Edge浏览.下载并安装 iGG谷歌访问助手 - Microsoft Edge Addons 登录https://microsoftedge.microsoft.com/addons/sear ...

  6. input标签file文件上传图片本地预览(转载)

    <input type="file" name="img-up" id="img-up" value="" /&g ...

  7. MyBatis-Plus通用Iservice 方法详解

    public interface IService<T> { /** * 默认批次提交数量 */ int DEFAULT_BATCH_SIZE = 1000; /** * 插入一条记录(选 ...

  8. 了解ASP(三) -- Cookie, Session, Application

    ASP一共内建了7个对象,有Session.Application.Cookie.Response.Request.Server,这些对象都可以直接使用. 1. 什么是 Cookie? 1. cook ...

  9. Windows10使用VMware安装centos

    系统环境: Windows 10 安装步骤: 1.下载centos http://mirrors.aliyun.com/centos/ 2.使用VMware安装centos 3.配置网络 $ cd / ...

  10. vite 运行或打包出现内存溢出的解决方案

    在使用vite运行或打包时出现了内存耗尽的报错 vite VUE npm run build 报错 npm ERR! code ELIFECYCLE npm ERR! errno 134 内存溢出 n ...