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

时间:2012-05-13 11:23:22

标签: c#-4.0

我可以使用.net ThreadPool设置一个多线程环境,但我确实获得了显着的性能优势。这是在我的申请背景下运行的。

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

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

一个。启动较小的后台线程,以便任何新的用户请求获得一些CPU资源。 (但我放松了我的表现增益:()

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

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

还有其他想法吗?

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

提前致谢!

1 个答案:

答案 0 :(得分:0)

请注意,线程调度由CPU完成,因此无法从程序中进行定向。唯一可以做的就是设置ThreadPriority(在新线程上也是如此,而不是在ThreadPool线程上)。查看Limitations of Using the Thread Pool

部分

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

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

在方法中设置检查点(由ThreadPool执行)类似于放置checkpoints for cancellation support in background worker.