/// <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;
}
相关文章
- 02-01C#流总结(文件流、内存流、网络流、BufferedStream、StreamReader/StreamWriter、TextReader/TextWriter、转载)
- 02-01【Golang基础】超时处理简单示例
- 02-01003-转载-keil-STM32硬件错误HardFault_Handler的处理方法
- 02-01c# – 无法在鼠标事件处理程序中读取WPF中保持的键状态 – VMWare Fusion for Mac中Windows guest虚拟机中的行为不一致
- 02-01Python程序超时处理
- 02-01[转载]SecureCRT 超时自动断开的解决方法
- 02-01pip下载超时处理
- 02-01c# – 在UWP中处理未处理的异常 – Windows 10
- 02-01我如何处理pycurl.error-超时异常?
- 02-012019 ICPC 南昌网络赛 - Subsequence (子串判断,预处理,超时)