我有一个查看数据库表,获取记录和发送电子邮件的进程。在一天/一个月的不同时间,这个过程可以得到很好的备份,目前我们有30个Windows服务实例正在运行以满足需求。
我们尝试创建单个实例,并为每个实例启动6个长时间运行的TPL任务,但这是静态的,并且不能很好地扩展。
我希望能够做的是查看要处理的表,计算请求数,并将池中的线程添加到指定的上限,比如NumProcessors * 10.当需求回落时,将这些线程从池中拉回来,因为每个线程每隔2秒对数据库进行一次,而我宁愿每个实例使用6个线程,而不是60个。
添加线程非常简单,但是我很难想到在需求下降时优雅地将线程拉出池的方法。
答案 0 :(得分:1)
在幕后Task
使用ThreadPool
- http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx
您可以使用SetMaxThreads
和SetMinThreads
函数控制池中的最大/最小线程数。
因此,在高峰时段,您可以将max threads
设置为NumProcessors * 10
,然后在需求返回时将其恢复为之前的值。
答案 1 :(得分:1)
执行此操作的一种方法是使用单个线程从数据库读取并将请求发送到处理线程(可能使用类似ConcurrentQueue
的内容)。
这样,你总是每2秒(或者其他)只打一次数据库,但你也可以有很多线程实际上做了很长时间的工作(发送电子邮件)。