.NET线程同步

use*_*293 6 .net c#

我打算使用自动重置事件句柄进行线程间通信.

EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 
Run Code Online (Sandbox Code Playgroud)

我的生产者线程代码如下所示

produceSomething(); 
handle.Set();
Run Code Online (Sandbox Code Playgroud)

在消费者线程中,我必须每隔一分钟或当生产者被称为Set方法时下载数据

try 
{ 
    while(true) 
    { 
        handle.WaitOne(60000, false); 
        doSomething();  // Downloads data from Internet.
                        // Takes lot of time to complete it.
    } 
} 
catch(ThreadAbortException) 
{ 
    cleanup(); 
} 
Run Code Online (Sandbox Code Playgroud)

我的问题是,如果消费者线程正在运行doSomething函数和生成器调用设置函数,那么自动重置事件对象的状态是什么?

我的要求是,一旦生成器调用设置方法,我必须从Internet下载新数据.如果doSomething函数正在运行,当Producer调用set方法时,我必须打断它并再次调用.

Joh*_*ler 2

自动重置事件就像一扇门,在第一个线程通过后关闭。如果在一个或多个线程正在等待时设置它,则一个线程会被唤醒,然后该事件将被重置,其余线程继续等待。

如果您在没有线程等待时设置,则第一个调用的线程handle.WaitOne将不会等待,但会导致事件重置然后继续。

来自http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

调用 Set 向 AutoResetEvent 发出信号以释放等待线程。AutoResetEvent 保持有信号状态,直到释放单个等待线程,然后自动返回到无信号状态。如果没有线程在等待,则状态将无限期地保持有信号状态。

如果线程在 AutoResetEvent 处于有信号状态时调用 WaitOne,则该线程不会阻塞。AutoResetEvent 立即释放线程并返回到无信号状态。