.net 4.0 c#:暂时暂停/恢复线程池中的并行运行线程



我可以使用.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 执行(中类似于在后台工作线程中放置取消支持的检查点。

最新更新