多个线程并发访问队列

时间:2012-02-06 18:58:14

标签: c# .net wcf

我正在使用NetTcpBinding服务和BasicHttpBinding服务创建一个应用程序。 通过这些服务,客户端向应用程序发送请求:这些请求必须放入Queue对象,即入站请求队列。

  1. 两种服务都必须允许来自客户端的并发呼叫。
  2. 这意味着两个服务应同时访问队列以添加收到的请求。
  3. 此外,另一个线程必须访问队列才能获取和处理请求。
  4. 我可以使用ConcurrencyMode.Multiple,因此可以同时进行多次调用。但是,这并不能保证对队列的并发访问。我应该将两个ServiceHost放在两个不同的主题中吗?例如:

    • 第一个线程将队列中的请求出列并处理。
    • 第二个线程实例化NetTcpBinding服务并将新请求排入队列。此外,它通过回调发送任何回复。
    • 第三个线程实例化BasicHttpBinding服务并将新请求排入队列。

    这是我的想法。 由于我几乎是一个新手,如果你能给我一些建议,我将不胜感激。 也许我应该开始编写三个同时访问队列的线程:目前前两个线程可能会将随机请求排入队列,而第三个线程会消耗这些请求。

2 个答案:

答案 0 :(得分:9)

如果您使用的是.NET 4,则应该查看ConcurrentQueue<T>BlockingCollection

基本上这些都是线程安全的集合,它们是为高性能而实现的,并且大多数都是无锁的。

BlockingCollection专门针对您描述的生产者 - 消费者场景实施。

供参考:

答案 1 :(得分:3)

由于你将自己描述为“我几乎是一个新手”,我建议你阅读更多的一般 - Threading in C# Joseph Albahari免费在线文章/书籍。它彻底审查了C#中的线程问题和工具。

我向你保证,仔细阅读第3和第4部分(并回顾第1部分和第2部分)将为您提供工具,不仅可以解决您当前的问题,还可以解决您在多线程方面遇到的许多其他问题。

如果您只想快速回答您的问题,请按照Yahia的回答。