• C# 超时事件


    View Code
        public class TimeOutEvent
        {
            public delegate void TimeOutStart(object o);
            private TimeOutStart timeOutStart;
            private Thread regexThread;
            private System.Timers.Timer regexTimeoutTimer;
            private ManualResetEvent allDone;
            public TimeOutEvent(TimeOutStart startAddress,int time=1000)
            {
                timeOutStart = startAddress;
                regexThread = null;
                regexTimeoutTimer = new System.Timers.Timer();
                regexTimeoutTimer.Interval = time;
                regexTimeoutTimer.AutoReset = false;
                regexTimeoutTimer.Elapsed += new ElapsedEventHandler(regexTimeoutTimer_Elapsed);
                allDone = new ManualResetEvent(false);
            }
            public bool Start(object o)
            {
                if (timeOutStart == null) return false;
                allDone.Reset();
                regexThread = new Thread(new ParameterizedThreadStart(Execute));
                regexThread.Start(o);
                regexTimeoutTimer.Start();
                allDone.WaitOne();
                regexTimeoutTimer.Stop();
                return true;
            }
            private void Execute(object o)
            {
                if (timeOutStart != null) timeOutStart(o);
                allDone.Set();
            }
            void regexTimeoutTimer_Elapsed(object sender, ElapsedEventArgs e)
            {
                if (regexThread!=null 
                    && regexThread.ThreadState == ThreadState.Running)
                {
                    regexThread.Abort();
                }
                allDone.Set();    
            }
        }

    应用背景

        一、网络连接,超过一定的时间链接仍未成功则取消链接,返回主线程。

        二、Net框架的正则表达式有时会进入死循环,可通过超时事件来防止主线程卡死。

    实例代码(网络连接)

    class SourceRequest
    {
         private HttpWebResponse webResponse;
         ……//省略代码
         //供外部调用的同步获取连接响应的函数
    public void GetResponse(string url) {        //创建请求对象
           HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);        //创建超时事件
        TimeOutEvent timeoutEvent = new TimeOutEvent(GetResponse,30000);        //启动超时事件
        timeoutEvent.Start(request); }    //超时事件的执行线程
    private void GetResponse(object request) {     webResponse=null;     webResponse=((HttpWebRequest)request).GetResponse(); } ……//省略代码 }

    实现原理

        

  • 相关阅读:
    手机号正则表达式精简
    如何查看ssl证书
    HTTPS原理教程
    收集了一些国外 DICOM 文件下载网站
    微前端总结
    react的路由的练习手册
    SSL证书伪造得了吗
    解密国内BAT等大厂前端技术体系美团点评之下篇(长文建议收藏)
    五大权威的SSL证书颁发机构(CA机构)介绍
    C#开发PACS医学影像处理系统(七):读取影像Dicom信息
  • 原文地址:https://www.cnblogs.com/easystep/p/2545763.html
Copyright © 2020-2023  润新知