在.NET中是否存在用于长时间运行线程的线程调度程序?

Log*_*gic 11 .net c# multithreading

我们的场景是网络扫描仪.

它连接到一组主机并使用低优先级后台线程并行扫描它们一段时间.

我希望能够安排大量的工作,但只有任何给定的说十个或同时扫描的任何数量的主机.即使我创建自己的线程,许多回调和其他异步优点使用ThreadPool,我最终耗尽资源.我应该看一下MonoTorrent ......

如果我使用ThreadPool,我是否可以将我的应用程序限制为某个数字,这些数字将足以让应用程序的其余部分顺利运行?

是否有一个线程池,我可以初始化为n长寿线程?

[编辑] 似乎没有人注意到我对一些回复做了一些评论,所以我会在这里添加一些东西.

  • 线程应该可以优雅和有力地取消.
  • 线程应具有低优先级,使GUI响应.
  • 线程长期运行,但是按顺序(分钟)而不是订单(天).

对于给定目标主机的工作基本上是:

  For each test
    Probe target (work is done mostly on the target end of an SSH connection)
    Compare probe result to expected result (work is done on engine machine)
  Prepare results for host
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么使用SmartThreadPool标记有消极的用处吗?

ntz*_*lis 8

在.NET 4中,您拥有集成的任务并行库.创建新任务(新线程抽象)时,您可以指定要长时间运行的任务.我们已经取得了很好的经验(长期是几天而不是几分钟或几小时).

您也可以在.NET 2中使用它,但它实际上是一个扩展,请在此处查看.

在VS2010中,基于任务(而非线程)的调试并行应用程序已得到彻底改进.建议尽可能使用Tasks而不是原始线程.因为它允许您以更加面向对象的友好方式处理并行性.

更新未
指定为长时间运行的任务将排队到线程池(或任何其他调度程序).
但是如果指定一个任务长时间运行,它只会创建一个独立的线程,不涉及任何线程池.


Jef*_*nal 5

CLR ThreadPool不适合执行长时间运行的任务:它用于执行短任务,其中创建线程的成本几乎与执行方法本身一样高.(或至少占执行该方法所花费的时间的很大一部分.)正如您所见,.NET本身消耗线程池线程,您不能为自己预留一块它们,以免冒着运行时间的风险.

调度,限制和取消工作是另一回事.没有其他内置的.NET工作队列线程池,所以你可以自己动手(自己管理线程BackgroundWorkers)或找到一个预先存在的线程池(Ami Bar的SmartThreadPool看起来很有前景,虽然我自己没有用过它).