我需要在新应用程序中创建多个处理线程。每个线程都有可能“长时间运行”。有人可以评论内置的.net线程池或一些现有的自定义线程池的可行性,以便在我的应用程序中使用吗?
要求:
在Windows服务中运行良好。 (可以从队列中删除排队的工作,可以告诉当前正在运行的线程暂停)
能够启动多个线程。
工作需要按顺序启动,但多个线程可以并行处理。
可以检测并杀死挂起的线程。
编辑:
评论似乎正在引领手动线程化。不幸的是,我坚持使用3.5版本的框架。 Threadpool很吸引人,因为它可以让我排队工作,并在资源可用时为我创建线程。是否有一个很好的3.5兼容模式(生产者/消费者)可以给我这个线程池方面而不实际使用线程池?
答案 0 :(得分:6)
您的要求基本上排除了使用.NET ThreadPool;
由于存在耗尽水池的危险,通常不应该用于长时间运行的线程。
它在Windows服务中运行良好,并且您可以启动多个线程 - 由池的限制自动限制。
您无法保证线程池的线程启动时间;当它有足够的空闲时,它可以将线程排队执行,甚至不保证它们会按照你提交的顺序启动。
在ThreadPool中没有简单的方法来检测和杀死正在运行的线程
基本上,你会想要在ThreadPool之外看;我可能会建议您可能需要'完整'System.Threading.Thread
实例,这可能仅仅是因为您的所有要求。只要你处理并发问题(就像你必须使用任何线程机制一样),我发现Thread类并不是那么难以管理自己,真的。
答案 1 :(得分:1)
简单回答,但Task
类(Fx4)符合您的大部分要求。
取消是合作的,即您的任务代码必须检查它 但检测悬挂线程很困难,无论如何这都是一个非常高的要求。
但我也可以阅读你对JobQueue的要求,其中'work'主要由类似的工作组成。您可以滚动自己的系统,消耗该队列并监视几个线程上的执行。
答案 2 :(得分:1)
我通过创建自己的线程管理器与.Net 3.5基本相同:
Queue<Thread>
。Dictionary<int, Worker>
,直到它达到其最大运行线程。将该线程添加为Worker实例的属性。