Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# .NET线程同步_C#_.net - Fatal编程技术网

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下载)
  • 生产商生产第二种产品
  • 生产商生产第三种产品
  • 生产停止了
  • 消费者消费第二项(重新发送事件并再次开始下载)
  • 消费者不会消费第三项,因为自动重置事件已重置