暂停/恢复与AutoResetEvent相关的线程

时间:2010-07-12 11:48:50

标签: c# .net multithreading

在这段代码中,我想使用AutoResetEvent和bool变量暂停/恢复一个线程。 如果阻塞== true,是否可以在每次测试时暂停(在for循环中工作())? 测试“阻塞”变量也需要锁定,我认为这很耗时。

class MyClass
    {
        AutoResetEvent wait_handle = new AutoResetEvent();
        bool blocked = false;

        void Start()
        {
            Thread thread = new Thread(Work);
            thread.Start();
        }

        void Pause()
        {
            blocked = true;
        }

        void Resume()
        {
            blocked = false;
            wait_handle.Set();
        }

        private void Work()
        {
            for(int i = 0; i < 1000000; i++)
            {
                if(blocked)
                    wait_handle.WaitOne();

                Console.WriteLine(i);
            }
        }
    }

1 个答案:

答案 0 :(得分:9)

是的,您可以使用ManualResetEvent来避免您正在执行的测试。

ManualResetEvent会让你的线程在“设置”(发信号)时通过,但与之前的AutoResetEvent不同,它不会在线程通过时自动重置。这意味着您可以将其设置为允许在循环中工作,并可以将其重置为暂停:

class MyClass
{  
    // set the reset event to be signalled initially, thus allowing work until pause is called.

    ManualResetEvent wait_handle = new ManualResetEvent (true);

    void Start()
    {
        Thread thread = new Thread(Work);
        thread.Start();
    }

    void Pause()
    {

        wait_handle.Reset();
    }

    void Resume()
    {
        wait_handle.Set();
    }

    private void Work()
    {
        for(int i = 0; i < 1000000; i++)
        {
            // as long as this wait handle is set, this loop will execute.
            // as soon as it is reset, the loop will stop executing and block here.
            wait_handle.WaitOne();

            Console.WriteLine(i);
        }
    }
}