/// <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; }
|
请发表评论