我可以使用.net ThreadPool设置多线程环境,并且确实获得了显着的性能优势。这在我的应用程序的后台运行。
现在,当用户请求新任务时,我希望它获得最大的 CPU 资源以最大限度地提高性能。因此,我想暂时暂停我开始的所有线程(通过 ThreadPool.Queueuserworkitem 方法(,然后在前台用户请求的新任务完成后恢复。
我的问题可能有几种解决方案:
a. 启动较少的后台线程,以便任何新用户请求都能获得一些 CPU 资源份额。(但我失去了我:(的性能提升(
b. 为新用户请求的任务设置更高的线程优先级。(不确定这是否有效?
c. 暂停/恢复我开始的线程池线程。但是强烈建议不要暂停/恢复/中断线程。此外,这可能会变得棘手且容易出错。
还有其他想法吗?
注意:当用户发出请求时,执行任务通常不会超过 300 毫秒。但是,当我在后台启动 ThreadPool 线程时,现在大约需要 3 秒才能完成(差 10 倍(!如果需要 500-800 毫秒,我没关系。所有后台线程在大约 8 秒内完成(如果它们多花 1-2 秒,我没关系(。因此,我现在正在尝试选项 ( a (。
提前感谢!
请注意,线程调度是由 CPU 完成的,因此不能从程序内部定向。唯一可以做的是设置线程优先级(在新线程上也是如此,而不是在线程池线程上(。检查使用线程池的限制部分
由于您的要求是在执行新任务时挂起所有后台线程,因此您可以做的是创建一个类级别标志。
现在,您可以将检查点放在要在后台任务中执行的方法中。在检查点,检查类级别标志,如果已设置,则调用 Thread.Sleep,它应该(不是必须(通过 OS/CPU 线程调度程序触发线程上下文切换。
将检查点放在方法(由 ThreadPool 执行(中类似于在后台工作线程中放置取消支持的检查点。