0

我有一个查看数据库表、获取记录并发送电子邮件的过程。在一天/月的不同时间,这个过程可以得到很好的备份,目前我们有 30 个 Windows 服务实例正在运行以满足需求。

我们尝试创建一个实例,并为每个实例启动 6 个长时间运行的 TPL 任务,但这是静态的,不能很好地扩展。

我想做的是查看要处理的表,计算请求的数量,并将线程添加到池中,直到指定的上限,比如 NumProcessors * 10。当需求下降时,拉这些线程退出池,因为每个线程每 2 秒访问一次数据库,我宁愿每个实例有 6 个线程而不是 60 个线程。

添加线程非常容易,但我很难想出一种在需求下降时优雅地从池中拉出线程的方法。

4

2 回答 2

1

一种方法是让一个线程从数据库中读取数据并将请求发送到处理线程(可能使用类似的东西ConcurrentQueue)。

这样,您总是每 2 秒(或其他任何时间)只访问一次数据库,但您也可以有许多线程实际执行需要很长时间的工作(发送电子邮件)。

于 2013-09-28T22:04:57.363 回答
1

幕后Task使用ThreadPool- http://msdn.microsoft.com/en-us/library/system.threading.threadpool.aspx

SetMaxThreads您可以使用和SetMinThreads函数控制池中的最大/最小线程数。

因此,您可以在高峰时间设置max threadsNumProcessors * 10,然后在需求返回时将其恢复到之前的值。

于 2013-09-28T21:56:35.967 回答