我设置它时,AutoResetEvent不会停止

时间:2014-06-16 15:06:59

标签: c# multithreading .net-3.5 timeout autoresetevent

我正在尝试使用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秒钟才能看到我的现金提取器未连接。一秒钟就足够了。

1 个答案:

答案 0 :(得分:1)

您可以在没有超时线程且没有事件的情况下执行此操作:

ActionThread.Start();
if (ActionThread.Join(1000))
{
    // thread completed successfully
}
else
{
    // timed out
}

请参阅Thread.Join的文档。