0

我可以使用 .net ThreadPool 设置多线程环境,并且确实获得了显着的性能优势。这在我的应用程序的后台运行。

现在,当用户请求新任务时,我希望它获得最大的 CPU 资源以最大化性能。因此,我想暂时暂停我开始的所有线程(通过 ThreadPool.Queueuserworkitem 方法),然后在前台用户请求的新任务完成后恢复。

我的问题可能有几种解决方案:

一个。启动较少的后台线程,以便任何新的用户请求都能获得一些 CPU 资源。(但我失去了我所获得的性能提升:()

湾。为新用户请求的任务的线程设置更高的优先级。(不确定这是否有效?)

C。暂停/恢复我开始的 ThreadPool 线程。但是非常不鼓励暂停/恢复/中断线程。此外,这可能会变得棘手且容易出错。

还有其他想法吗?

注意:当用户发出请求时,执行任务通常不会超过 300ms。但是,当我在后台启动 ThreadPool 线程时,现在大约需要 3 秒才能完成(差 10 倍)!不过,如果需要 500-800 毫秒,我可以。所有后台线程在大约 8 秒内完成(如果它们多花 1-2 秒我就可以了)。因此,我现在正在尝试选项 ( a )。

提前致谢!

4

1 回答 1

0

请注意,线程调度是由 CPU 完成的,因此不能从程序内部进行。唯一可以做的就是设置 ThreadPriority(这也是在新线程上,而不是在 ThreadPool 线程上)。检查使用线程池的限制部分

由于您的要求是在执行新任务时暂停所有后台线程,您可以做的是创建一个类级别标志。

现在您可以将检查点放在要在后台任务中执行的方法中。在检查点,检查类级别标志,如果已设置,则调用 Thread.Sleep,它应该(不是必须)触发 OS/CPU 线程调度程序的线程上下文切换。

在方法中放置检查点(由 ThreadPool 执行)类似于在后台工作人员中放置取消支持的检查点。

于 2012-05-13T11:41:50.367 回答