近期项目中需在用户点击按钮后,延时执行代码逻辑,避免频繁操作。网上没找到有关 C# SetTimeout 官方API , 于是通过异步线程,动手实现一个。方案如下,如果同一个DelayedProcess 对象连续调用 SetTimeout 多次 ,默认取消前一次调用。

  1. public class DelayedProcess<Req,Rsp>
  2. {
  3. public delegate void ExcuteMethod(Result rsp);
  4. CancellationTokenSource tokenSource;
  5.  
  6. public class Result {
  7.  
  8. public Req request {
  9. get;
  10. set;
  11. }
  12.  
  13. public Rsp response {
  14. get;
  15. set;
  16. }
  17.  
  18. /// <summary>
  19. /// 抛出异常信息
  20. /// </summary>
  21. public Exception ex;
  22.  
  23. /// <summary>
  24. /// 是否延时执行成功
  25. /// </summary>
  26. public bool IsSuccess {
  27. get;
  28. set;
  29. }
  30. }
  31.  
  32. async void TaskDelay(int timeout, CancellationToken token, ExcuteMethod method, Result rsp)
  33. {
  34. try
  35. {
  36. await Task.Delay(timeout, token);
  37. rsp.IsSuccess = true;
  38. rsp.ex = null;
  39. }
  40. catch (Exception ex)
  41. {
  42. rsp.ex = ex;
  43. rsp.IsSuccess = false;
  44. }
  45. finally {
  46. method(rsp);
  47. }
  48. }
  49.  
  50. public void SetTimeout(int timeout, ExcuteMethod method, Result rsp)
  51. {
  52. Cancel();
  53. tokenSource = new CancellationTokenSource();
  54. TaskDelay(timeout, tokenSource.Token, method , rsp);
  55. }
  56.  
  57. public void Cancel()
  58. {
  59. if (tokenSource != null && !tokenSource.IsCancellationRequested)
  60. {
  61. tokenSource.Cancel();
  62. }
  63. }
  64. }

  

调用示例:

  1. DelayedProcess<string, string> dp = new DelayedProcess<string, string>();
  2.  
  3. private void button1_Click(object sender, EventArgs e)
  4. {
  5. Console.WriteLine("{0}:{1}", DateTime.Now, "开始请求");
  6. dp.SetTimeout(2000, (arg) => {
  7. if (arg.IsSuccess)
  8. {
  9. Console.WriteLine("{0}:延时执行{1}", DateTime.Now, arg.request);
  10. }
  11. else {
  12. Console.WriteLine("{0}:延时失败,{1}", DateTime.Now, arg.ex.Message);
  13. }
  14. }, new DelayedProcess<string, string>.Result() { request = "1111" });
  15. }

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. iview表单验证

    iview表单验证的步骤 第一步:给 Form 设置属性 rules :rules="规则设置" 第二步:同时给需要验证的每个 FormItem 设置属性 prop 指向对应字段即 ...

  2. python 在一个文件夹的所有文件中查找关键字

    python 在一个文件夹的所有文件中查找关键字 import os,shutil import re key='Hello' re_parttern=re.compile(r''+key,re.DO ...

  3. 【Nginx】优化,增加线程

    https://blog.csdn.net/cnskylee/article/details/127645806 众所周知,Nginx一款体积小巧,但是性能强大的软负载,主要被用作后端服务和应用的反向 ...

  4. MyCat2 分表分库

    1.添加数据库.存储数据源 我们在读写分离那边已经生成过,不需要在执行,如果没有执行过,执行下面注解,我们这边重新创建一个数据库db1 /*+ mycat:createDatasource{ &quo ...

  5. Mysql习题系列(三):单行函数

    案例数据 提取码:2rd5 #[题目] # 1.显示系统时间(注:日期+时间) # 2.查询员工号,姓名,工资,以及工资提高百分之20%后的结果(new salary) # 3.将员工的姓名按首字母排 ...

  6. 【C学习笔记】day4-2 求出0~999之间的所有“水仙花数”并输出。

    2.求出0-999之间的所有"水仙花数"并输出."水仙花数"是指一个三位数,其各位数字的立方和确好等于该数本身,如:153=1+5+3?,则153是一个&quo ...

  7. [Unity]利用Mesh绘制简单的可被遮挡,可以探测的攻击指示器

    最近做一个小游戏的Demo,最终的效果是这样的 主要是利用Mesh绘制三角形作为显示,然后使用后处理来制作探灯,注意,性能一般,仅仅适合小游戏 分为3步 1:利用mesh绘制三角形,原理很简单,利用三 ...

  8. uni小程序保存base64图片

    使用uni.getFileSystemManager().writeFile去下载base64图片<view class="share-btn" @click="s ...

  9. DOM状态监听(观察者模式)

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  10. Oracle常用的日期操作函数 to_char()和to_date

    https://www.cnblogs.com/zhangliang88/p/12924407.html