我打算使用自动重置事件句柄进行线程间通信.
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方法时,我必须打断它并再次调用.
自动重置事件就像一扇门,在第一个线程通过后关闭。如果在一个或多个线程正在等待时设置它,则一个线程会被唤醒,然后该事件将被重置,其余线程继续等待。
如果您在没有线程等待时设置,则第一个调用的线程handle.WaitOne将不会等待,但会导致事件重置然后继续。
来自http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx
调用 Set 向 AutoResetEvent 发出信号以释放等待线程。AutoResetEvent 保持有信号状态,直到释放单个等待线程,然后自动返回到无信号状态。如果没有线程在等待,则状态将无限期地保持有信号状态。
如果线程在 AutoResetEvent 处于有信号状态时调用 WaitOne,则该线程不会阻塞。AutoResetEvent 立即释放线程并返回到无信号状态。