0

如果已经有太多任务排队,TaskFactory 是否有可能长时间不运行任务?如果是这样,有一种方法可以配置 taskfactory 以便它能够更快地运行更多任务。

此外,在同一进程中同时使用 TaskFactory 和 Threadpool.QueueUserWorkItem 会有任何问题吗?我们有一些仍然使用 Threadpool 类的旧库。

4

2 回答 2

2

阿尔文。当您将要运行的任务排队时,它们将被安排使用 ThreadPool 中的线程运行。运行多少任务,以及它们运行的​​速度将取决于可用线程的数量以及特定任务执行所需的时间。如果有很多队列任务,线程池能够根据需要启动新线程,但这在很大程度上取决于可用资源和 cpu。可以将线程池​​配置为设置默认线程数,但在大多数情况下不建议这样做。

将 Tasks 和 Thrapool.QueueUserWorkItem 一起使用应该不会有任何问题,因为默认的 Task 调度程序使用相同的线程池。所有这一切都会发生,您将有更多排队的任务等待同一个线程池处理。

于 2012-07-12T11:21:52.673 回答
0

使用TPL,你的任务会自动进入线程池;线程池在其中密切关注它将同时运行的正在运行的线程数。过多的活动线程会降低性能并增加操作系统的管理负担。一旦达到线程数量的预定义限制,它们就会被排队。一些背景...

线程池从池中的一个线程开始,池管理器“注入”新线程以应对额外的异步工作负载,达到某个限制最大值。在一段时间的不活动之后,如果池管理器“认为”这样做会带来更好的吞吐量,它可能会“退休”线程。在您上面的情况下,池管理器正在限制并发线程的数量。

您可以通过调用设置池将创建的线程数上限Thread.Pool.SetMaxThread;,默认值为:

1023 in Framework 4.0 in a 32-bit environment.
32768 in Framework 4.0 in a 64-bit environment.
250 per core in Framework 3.5.
25 per core in Framework 2.0.

[这些数字可能因硬件和操作系统而异]。

这些庞大数量的原因(至少在 .NET 4.0 的情况下)是为了确保即使在某些线程被阻塞(运行一些紧张的工作等)时也能取得进展

您可以通过 设置下限ThreadPool.SetMinThreads。这个限制器的作用比最大限制器的作用更微妙:这指示池管理器不要延迟线程的创建,直到达到这个数量的下限 - 当有阻塞的线程时设置这个数量将提高你的并发性。

如果您使用的是早于 Framework 4.0 的版本,则不能使用 TPL。您可以使用 4.0 并调用QueueUserWorkItem- 这(乍一看)不会给您带来任何问题。

我希望这有帮助。

于 2012-07-12T11:25:08.830 回答