2016-12-03 36 views
0

假设我有3个线程T1,T2,T3等待数据D1,D2,D3。数据由另一个线程提供。我怎样才能暂停这些线程,并且(A)让手头的数据继续执行,或者作为另一种方法,我如何让(B)让所有三个线程执行一个循环来检查它们是否有可用的数据,然后再次停止。基于接收到的数据继续线程

为了使它更具体一点,假设D2将可用,然后在解决方案(A)中线程T2应该继续,并且在解决方案(B)中,所有三个都将继续并验证数据是否适用于它们,如果不适合他们,请再检查一次。

我知道我可以用的数据,并为每个线程的的AutoResetEvent的关键一本字典解决这个问题,但是这似乎并不很优雅......有没有更优雅的方式?

谢谢!

Edwin。

+1

根据这些数据。可以使用[BlockingCollection ](https://msdn.microsoft.com/en-us/library/dd267312(V = vs.110).ASPX?CS-保存琅= 1&CS琅= CSHARP#代码段-1)为“A”选项。 – Fabio

+0

谢谢。看起来很有希望。什么是.NET 3.5的解决方案? – Edwin

+1

移至.NET 4.6 :) – Fabio

回答

0

更多的研究后,我找到了解决自己的情况(B)中,恕我直言the most useful threading reference source

如何使用等待和脉冲

下面介绍如何使用等待脉:

定义用作同步对象的单个字段,例如:

readonly object _locker = new object(); 

Def ine字段在您的自定义阻止条件中使用。例如:

bool _go; or: int _semaphoreCount; 

每当要封锁,包括以下代码:

lock (_locker) 
    while (<blocking-condition>) 
    Monitor.Wait (_locker); 

每当改变(或潜在地改变)一个阻塞条件,包括以下代码:

lock (_locker) 
{ 
    // Alter field(s) or data that might impact blocking condition(s) 
    // ... 
    Monitor.Pulse(_locker); // or: Monitor.PulseAll (_locker); 
}