在C#中的多线程情况下使用队列

时间:2010-06-25 01:47:49

标签: c# .net multithreading queue race-condition

我只是了解了queues in .NET ,我有几个问题。

假设我正在构建一个下载页面HTML然后处理它的应用程序。以下是我希望它如何运作:

  1. 主线程将URL添加到队列
  2. 此队列由另外两个线程读取。他们将一个URL“出列”,然后下载相应的HTML。
  3. 然后将HTML发送回主线程。
  4. 当HTML到达主线程时,它被放入另一个队列,由另外两个线程处理。这些线程处理HTML。
  5. 处理结果将返回主线程。

  6. 如何在没有竞争条件的情况下实施这样的场景?

    另外,如上所述,在队列和线程之间传递信息的最佳方法是什么?

    你能给我一些示例代码吗?

    谢谢!

2 个答案:

答案 0 :(得分:1)

我建议BlockingCollection<T>。它代表多线程中常见的“生产者/消费者队列”。

答案 1 :(得分:0)

有两种方式可以想到。

第一种方法是使用一个实现锁定的集合来产生线程安全的一致性(如其他地方提到的BlockingCollection)。

第二种方法是使用一个不可变的集合(例如Eric {http://blogs.msdn.com/b/ericlippert/archive/2007/11/13/immutability-in-c-part-one-kinds-of-immutability.aspx中描述的那些集合),它首先避免了线程锁定和竞争条件的大部分麻烦,并使得剩下的东西永远留在了通常会更加明显。