C# 中 SetTimeout 方案

2021-01-22 08:12

阅读:715

标签:timeout   end   tar   response   requested   ons   color   lse   cell   

C# 中 延时执行方案,如下,如果同一个DelayedProcess 对象连续调用 SetTimeout ,默认取消前一次调用.

 public class DelayedProcess
    {
        public delegate void ExcuteMethod(Result rsp);
        CancellationTokenSource tokenSource;

        public class Result {

            public Req request {
                get;
                set;
            }

            public Rsp response {
                get;
                set;
            }

            /// 
            /// 抛出异常信息
            /// 
            public Exception ex;

            /// 
            /// 是否延时执行成功
            /// 
            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();
            }
        }
    }

  

调用示例:

  DelayedProcessstring, string> dp = new DelayedProcessstring, 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 DelayedProcessstring, string>.Result() { request = "1111" });
        }

C# 中 SetTimeout 方案

标签:timeout   end   tar   response   requested   ons   color   lse   cell   

原文地址:https://www.cnblogs.com/howtrace/p/12083645.html


评论


亲,登录后才可以留言!