阻止无限循环线程的一次迭代

时间:2014-09-19 16:08:21

标签: .net thread-safety

我有一个循环并做一些工作并在执行之间休眠的线程。我需要一个方法来强制循环执行一次迭代并等待一个完整的迭代完成

我能够强制循环以AutoResetEvent运行,但是不能想到一种安全的方式来等待胎面完成一次迭代。

public class EndlessLoopThread
{
    private AutoResetEvent _wakeupEvent = new AutoResetEvent(false);
    private Thread _thread;
    public int Count;

    public EndlessLoopThread()
    {
        _thread = new Thread((s) =>
        {
            while (true)
            {
                //... (Do a bunch of important stuff here)
                Interlocked.Increment(ref Count);

                _wakeupEvent.WaitOne(5000);
            }
        });
        _thread.Start();
    }

    public void DoStuffOnThreadAndBlockUntilDone()
    {
        _wakeupEvent.Set();

        //how do i block until the thread has done its stuff and gone back to sleep
    }
}

在线程完成工作之前我是否可以阻止任何想法?

1 个答案:

答案 0 :(得分:1)

您可以从线程添加信号机制到应该等待的方法。然后使用以下内容:

_workStarted.Reset();
_workCompleted.Reset();
_wakeupEvent.Set();
_workStarted.WaitOne();
_workCompleted.WaitOne();

这应该保证重要的东西至少被执行一次。

然而,解决方案有点复杂,表明问题可以重新设计。我认为你可以更好地使用像模式这样的消费者/生产者。添加要完成的东西并等待特定的东西完成,或者没有任何东西可以处理。但是,需要更多关于用例的知识。