在网上搜索了很多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;
- }