• C#超时处理(转载)


     /// <summary>
        /// 超时处理
        ///
        ///
        /// </summary>
        public class TimeoutChecker
        {
            long _timeout;              //超时时间
            System.Action<Delegate> _proc;               //会超时的代码
            System.Action<Delegate> _procHandle;         //处理超时
            System.Action<Delegate> _timeoutHandle;      //超时后处理事件
            System.Threading.ManualResetEvent _event = new System.Threading.ManualResetEvent(false);

            public TimeoutChecker(System.Action<Delegate> proc, System.Action<Delegate> timeoutHandle)
            {            
                this._proc = proc;
                this._timeoutHandle = timeoutHandle;
                this._procHandle = delegate
                {
                    //计算代码执行的时间
                    System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                    sw.Start();
                    if (this._proc != null)
                        this._proc(null);
                    sw.Stop();
                    //如果执行时间小于超时时间则通知用户线程
                    if (sw.ElapsedMilliseconds < this._timeout && this._event != null)
                    {
                        this._event.Set();
                    }
                };            
            }
            public bool Wait(long timeout)
            {
                this._timeout = timeout;
                //异步执行
                this._procHandle.BeginInvoke(null, null,null);
                //如果在规定时间内没等到通知则为 false
                bool flag = this._event.WaitOne((int)timeout, false);
                if (!flag)
                {
                    //触发超时时间
                    if (this._timeoutHandle != null)
                        this._timeoutHandle(null);
                }
                this.Dispose();           

                return flag;
            }        
            private void Dispose()
            {       
                if(this._event != null)
                    this._event.Close();
                this._event = null;
                this._proc = null;
                this._procHandle = null;
                this._timeoutHandle = null;              
            }        
        }

    调用超时处理方法:

     /// <summary>
            /// 检查摄像头是否可用
            /// </summary>
            /// <param name="device">所选设备</param>
            /// <param name="image">摄像头输出,用于判断</param>
            /// <returns>image不为空摄像头可用,否则不可用</returns>
            public bool isCameraWork(Camera device, NImage image)
            {
                try
                {
                    device.StartCapturing();
                    TimeoutChecker timeout = new TimeoutChecker(
                        delegate
                        {
                            try
                            {
                                image = device.GetCurrentFrame();
                            }
                            catch
                            {
                                image = null;
                                nlView.Image = null;
                            }
                        },
                        delegate
                        {
                            Console.WriteLine(device.ToString() + "获取设备超时");
                        });
                    if (timeout.Wait(1000))
                        Console.WriteLine(device.ToString() + " 设备获取成功");
                }
                catch (Exception e)
                {
                    image = null;
                    Console.WriteLine(device.ToString() + e.Message);
                }
                device.StopCapturing();
                if (image != null)
                    return true;
                else
                    return false;
            }

  • 相关阅读:
    《C++ Primer Plus》15.1 友元 学习笔记
    《C++ Primer Plus》14.4 类模板 学习笔记
    《C++ Primer Plus》14.3 多重继承 学习笔记
    《C++ Primer Plus》14.2 私有继承 学习笔记
    《C++ Primer Plus》第13章 类继承 笔记
    继承和动态内存分配——需要为继承类定义 显式析构函数、复制构造函数和赋值运算符
    C++中的抽象基类示例
    C++ 在继承中使用virtual
    《C++ Primer Plus》第12章 类和动态内存分配 学习笔记
    《C++ Primer Plus》12.7 队列模拟 学习笔记
  • 原文地址:https://www.cnblogs.com/zhoulove/p/4121039.html
Copyright © 2020-2023  润新知