【问题标题】:Concurrent access to a queue by multiple threads多线程并发访问队列
【发布时间】:2012-02-06 18:58:13
【问题描述】:

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

  1. 两个服务都必须允许来自客户端的并发调用。
  2. 这意味着两个服务应该同时访问队列以添加接收到的请求。
  3. 此外,另一个线程必须访问队列才能获取和处理请求。

我可以使用ConcurrencyMode.Multiple,可以同时接听很多电话。但是,这并不能保证对队列的并发访问。我应该将两个ServiceHost 放在两个不同的线程中吗?例如:

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

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

【问题讨论】:

  • 你绑定到队列了吗?你可以使用 ConcurrentQueue 或 BlockingCollection 吗?这是一个非常标准的生产者/消费者问题。
  • @Joe:现在我应该使用非线程安全的集合,比如QueueDictionary,等等。
  • 有什么特别的原因吗?您很可能只是在重新实现轮子。
  • @Joe:学习如何在 C# 中管理线程的唯一教育原因。稍后我将不得不使用线程安全集合来修改这个应用程序。

标签: c# .net wcf


【解决方案1】:

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

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

BlockingCollection 是专门为您描述的生产者-消费者-场景实现的。

参考见:

【讨论】:

    【解决方案2】:

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

    我向您保证,仔细阅读第 3 部分和第 4 部分(并查看第 1 和第 2 部分)将为您提供工具,不仅可以解决您当前的问题,还可以解决您在多线程处理过程中遇到的许多其他问题.

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

    【讨论】:

      猜你喜欢
      • 2017-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-17
      • 2017-06-15
      • 2013-08-30
      • 2021-06-21
      • 1970-01-01
      相关资源
      最近更新 更多