【问题标题】:How can I Add/Remove TPL Threads dynamically?如何动态添加/删除 TPL 线程?
【发布时间】:2013-09-29 06:09:26
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: c# multithreading task-parallel-library .net-4.5


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      所以在高峰期你可以将max threads设置为NumProcessors * 10,然后在需求返回时将其恢复到之前的值。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多