近期项目中需在用户点击按钮后,延时执行代码逻辑,避免频繁操作。网上没找到有关 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. Vulhub 漏洞学习之:AppWeb

    Vulhub 漏洞学习之:AppWeb 目录 Vulhub 漏洞学习之:AppWeb 1 AppWeb认证绕过漏洞(CVE-2018-8715) 1.1 漏洞利用原理 1.2 漏洞利用过程 1 App ...

  2. CCRD总目录(2007年至今,动态更新中)

    中信国健临床通讯总目录 (动态更新.末次更新: 2015-07-06) 年份 目录网址 2010年 1.2010年第01期 (或者浏览有备注的目录: 2010年第01期 ) 2.  2010年第02期 ...

  3. C#泛型接口请求封装类

    using HttpUtil; using Newtonsoft.Json; using System; using System.Collections.Generic; using System. ...

  4. NameError: name '_name_' is not defined

    if _name_ == '_main_': 错误的原因可能是name是双下划线.(明显下面的下划线要长一点) if __name_ == '_main__':

  5. BUUCTF—CRYPTO 1—10

    BUUCTF-CRYPTO 1-10 1.MD5 题目:e00cf25ad42683b3df678c61f42c6bda 解析:看题目就知道是MD5加密,直接上在线解码网站解码,答案是:flag 2. ...

  6. PostgreSQL建立索引时,如何避免写数据锁定

    先介绍一下Postgresql的建索引语法: CREATE [ UNIQUE ] INDEX [ CONCURRENTLY ] [ name ] ON table [ USING method ] ( ...

  7. Jmeter 常用命令 之 CLI模式

    一.Jmeter的非GUI模式命令(即CLI模式command line) 命令: 命令参数 命令释义 -n 设置命令行模式 -t 指定JMX脚本路径参数为:JMX脚本路径,若非当前目录需用全路径或相 ...

  8. K8s集群版本升级

    k8s组件升级流程: 升级主管理节点→升级其他管理节点→升级工作节点 首先备份主管理节点的etcd,检查版本号,为了保证版本的兼容性,跨度最好不要超过两个版本. [root@master ~]# ku ...

  9. ORACLE 遇到ORA 03113 数据库连接卡住

    环境:RAC 双节点 发现两个节点的alert日志中出现大量的 opiodr aborting process unknown ospid (150950) as a result of ORA-60 ...

  10. vue项目去掉网页滚动条

    点击查看代码 <template> <div id="app"> <router-view /> </div> </templ ...