最佳线程队列示例/最佳实践

时间:2008-12-06 13:32:44

标签: c# multithreading

我有需要在某个后台线程上执行的数据。我有来自所有其他需要调用的线程的代码。有没有人有一个很好的教程或最佳实践,有一个同步队列来支持这个线程需求

5 个答案:

答案 0 :(得分:33)

查看Joseph Albahari撰写的Threading in C#,关于多线程的非常完整的参考资料。特别是,他涵盖了producer/consumer queues

答案 1 :(得分:9)

你可以:

答案 2 :(得分:5)

这是一篇关于ThreadPools的有趣文章:

  

http://www.codeproject.com/KB/threads/smartthreadpool.aspx

对于更简单的用例,您还可以使用.Net自己的ThreadPool类。

答案 3 :(得分:1)

此问题的一个我最喜欢的解决方案类似于producer/consumer模式。

我创建了一个主线程(几乎是我的程序的Main()),它拥有一个阻塞队列对象。

这个主线程旋转了几个工作线程,这些线程简单地弹出中央阻塞线程并处理它们。由于它是线程安全的阻塞队列,因此同步位很容易 - TaskQueue.Dequeue()调用将阻塞,直到任务被生产者/主线程排队。

您可以根据配置变量动态管理所需的工作者数量或修复它们 - 因为它们只是从队列中弹出来的东西,工作者的数量不会增加任何复杂性。

就我而言,我有一个处理几种不同类型的tasks的服务。我有队列类型来处理像TaskQueueTask这样的通用名称。然后我将其子类化并覆盖Execute()方法。


我也尝试过.NET线程池方法,你可以很容易地把东西扔进池中。它使用起来非常简单,但也提供了很少的控制,并且不保证执行顺序,时间等。建议仅用于轻量级任务。

答案 4 :(得分:0)

您可以尝试此解决方案。它向您展示了如何实现生产者 - 消费者模式。对于可以用它做什么也有一些解释。喜欢生产者和消费者数量的不同组合。

http://devpinoy.org/blogs/jakelite/archive/2009/01/12/threading-patterns-the-producer-consumer-pattern.aspx

http://devpinoy.org/blogs/jakelite/archive/2009/02/03/threading-patterns-producer-consumer-pattern-examples.aspx