zoukankan      html  css  js  c++  java
  • 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#】HTTP请求GET,POST(远程证书失效)
    登录验证的js;JS验证邮箱 验证密码
    字符串验证类
    ASP.NET获取客户端信息,获取客户端IP等等
    HttpCookie类
    js获取页面的来源页
    JS URL传中文参数引发的乱码问题
    SQL Server 2008删除或压缩数据库日志的方法
    数据库SQL优化大总结之 百万级数据库优化方案
  • 原文地址:https://www.cnblogs.com/howtrace/p/12083645.html
Copyright © 2011-2022 走看看