我有需要在某个后台线程上执行的数据。我有来自所有其他需要调用的线程的代码。有没有人有一个很好的教程或最佳实践,有一个同步队列来支持这个线程需求
答案 0 :(得分:33)
查看Joseph Albahari撰写的Threading in C#,关于多线程的非常完整的参考资料。特别是,他涵盖了producer/consumer queues。
答案 1 :(得分:9)
你可以:
答案 2 :(得分:5)
这是一篇关于ThreadPools的有趣文章:
对于更简单的用例,您还可以使用.Net自己的ThreadPool类。
答案 3 :(得分:1)
此问题的一个我最喜欢的解决方案类似于producer/consumer
模式。
我创建了一个主线程(几乎是我的程序的Main()
),它拥有一个阻塞队列对象。
这个主线程旋转了几个工作线程,这些线程简单地弹出中央阻塞线程并处理它们。由于它是线程安全的阻塞队列,因此同步位很容易 - TaskQueue.Dequeue()
调用将阻塞,直到任务被生产者/主线程排队。
您可以根据配置变量动态管理所需的工作者数量或修复它们 - 因为它们只是从队列中弹出来的东西,工作者的数量不会增加任何复杂性。
就我而言,我有一个处理几种不同类型的tasks
的服务。我有队列类型来处理像TaskQueueTask
这样的通用名称。然后我将其子类化并覆盖Execute()
方法。
我也尝试过.NET线程池方法,你可以很容易地把东西扔进池中。它使用起来非常简单,但也提供了很少的控制,并且不保证执行顺序,时间等。建议仅用于轻量级任务。
答案 4 :(得分:0)
您可以尝试此解决方案。它向您展示了如何实现生产者 - 消费者模式。对于可以用它做什么也有一些解释。喜欢生产者和消费者数量的不同组合。