我必须在.Net3.5中编写多个线程(现在至少3个)之间的通信,并且每个线程都是 生产环境 者和消费者 . 而不是在每对线程之间发送信号,我的想法是实现一个消息队列,它将存储类,如下所示:
enum Signals { ObjectArrivedOnLightBarrier, ObjectLeftLightBarrier, CodeFound };
enum UnitID { GrabThread, ImageProcessingThread, SaveThread };
// Consumer shows who the message is intended for (and only that unit is allowed to remove it from the queue)
public class QueuedSignal
{
Signals Message;
UnitID Producer;
UnitID Consumer;
}
这个想法是任何线程都可以查看队列中的第一个项目,如果消息不适合它就不管它(如果其他消息很少而且其中一个消息可能用于此线程则不会出现问题) .
当有多个 生产环境 者和消费者时,队列是否是线程安全的 .
2 回答
Queue<T> is not threadsafe.
如果您使用的是.Net 4或更高版本,我建议您使用BlockingCollection<T> .
不幸的是,你不能使用它,但有几个并发队列的实现 .
在Marc Gravel的回答中看看this one . 不幸的是,它没有Peek()方法 .
这是我以前用过的一个类.Net 4出来了;也许这可能是你感兴趣的 . 这不是最好的实施;我们更多地使用它作为占位符,直到.Net 4出现 . 即便如此,这里是:
这是一个旧的单元测试 . 这不是一个非常好的单元测试;它一次测试太多东西并有其他一些问题,但它将演示如何使用队列:
June 2008 CTP of the Parallel Extensions for .NET包含一个
BlockingCollection<T>
类,它可以做你想要的 . 虽然它可能没有Peek
方法 . 该库适用于.NET 3.5 . 我用了很多东西 .我一直无法找到下载它的地方,但你可能会做一些搜索 .
它可能在Reactive Extensions中可用 . 较新版本的Rx适用于.NET 4.5,但有一个旧版本可在http://www.microsoft.com/en-us/download/details.aspx?id=28568获得