/// <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;
}