C# .NET线程同步
我计划使用自动重置事件句柄进行线程间通信C# .NET线程同步,c#,.net,C#,.net,我计划使用自动重置事件句柄进行线程间通信 EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset); 我的生产者线程代码如下所示 produceSomething(); handle.Set(); 在消费者线程中,我必须每一分钟或每一分钟下载一次数据 称为集合方法 try { while(true) { handle.WaitOne(60000, fa
EventWaitHandle handle = new EventWaitHandle(false, EventResetMode.AutoReset);
我的生产者线程代码如下所示
produceSomething();
handle.Set();
在消费者线程中,我必须每一分钟或每一分钟下载一次数据
称为集合方法
try
{
while(true)
{
handle.WaitOne(60000, false);
doSomething(); // Downloads data from Internet.
// Takes lot of time to complete it.
}
}
catch(ThreadAbortException)
{
cleanup();
}
我的问题是,若使用者线程正在运行doSomething
函数,而生产者调用set函数,那个么自动重置事件对象的状态会是什么
我的要求是,一旦制作人调用set方法,我就必须从互联网上下载新数据。如果
doSomething
函数正在运行,当生产者调用set方法时,我必须中断它并再次调用。自动重置事件就像第一个线程通过后关闭的门。如果在一个或多个线程等待时设置它,那么一个线程将被唤醒,事件将被重置,其余线程将继续等待
如果在没有线程等待时进行设置,则调用handle.WaitOne
的第一个线程将不会等待,但它将导致事件重置,然后继续
从
调用Set发出AutoResetEvent信号以释放等待的线程。AutoResetEvent保持有信号状态,直到释放单个等待线程,然后自动返回到无信号状态。如果没有线程在等待,状态将无限期地保持信号状态
如果在AutoResetEvent处于信号状态时线程调用WaitOne,则该线程不会阻塞。AutoResetEvent立即释放线程并返回到无信号状态
场景中自动重置事件的问题是“设置”它不支持排队 也就是说,设置自动重置事件允许一个线程进入,如果在任何线程“消耗”事件之前再次设置,则该“设置”将丢失。您可能希望有两个线程能够进入并使用您生成的任何内容,但实际上只有一个线程能够这样做 在您的情况下,如果生产速度快于消费速度,则自动重置事件可能会出错。想象一下这种情况
- 生产商生产一种产品
- 消费者消费项目(重置事件并开始从inet下载)
- 生产商生产第二种产品
- 生产商生产第三种产品
- 生产停止了
- 消费者消费第二项(重新发送事件并再次开始下载)
- 消费者不会消费第三项,因为自动重置事件已重置