我正在尝试使用AutoResetEvent
进行操作或离开,如果花费太多时间。
这是我正在运行的代码:
TimeoutAction action = new TimeoutAction(1000, OuvrirDrawer);
action.Start();
这是我的TimeoutAction
课程:
public class TimeoutAction
{
private Thread ActionThread { get; set; }
private Thread TimeoutThread { get; set; }
private AutoResetEvent ThreadSynchronizer { get; set; }
private bool _success;
private bool _timout;
public TimeoutAction(int waitLimit, Action action)
{
ThreadSynchronizer = new AutoResetEvent(false);
ActionThread = new Thread(new ThreadStart(delegate
{
action.Invoke();
if (_timout) return;
_timout = false;
_success = true;
ThreadSynchronizer.Set();
}));
TimeoutThread = new Thread(new ThreadStart(delegate
{
Thread.Sleep(waitLimit);
if (_success) return;
_timout = true;
_success = false;
ThreadSynchronizer.Set();
}));
}
/// <summary>
/// If the action takes longer than the wait limit, this will throw a TimeoutException
/// </summary>
public void Start()
{
ActionThread.Start();
TimeoutThread.Start();
ThreadSynchronizer.WaitOne();
if (_success)
{
// TODO when action has completed
}
ThreadSynchronizer.Close();
}
}
我认为最多需要1000ms,因为TimeoutAction
将在1000ms后发送信号。
因此,即使方法OuvrirDrawer
需要5秒钟,我也应该在大约1000ms之后到达我的TODO线。
好吧,猜猜看,不是。
我的方法OuvrirDrawer
正在尝试打开我的现金抽屉,但当它没有连接到我的电脑时,它会崩溃。
我已经把一个空的捕获但是当它试图打开它时,它需要一段时间(5秒)。
根据上面的代码,我希望在1秒内超时,我不想等待5秒钟才能看到我的现金提取器未连接。一秒钟就足够了。
答案 0 :(得分:1)
您可以在没有超时线程且没有事件的情况下执行此操作:
ActionThread.Start();
if (ActionThread.Join(1000))
{
// thread completed successfully
}
else
{
// timed out
}
请参阅Thread.Join的文档。