2012-05-13 130 views
0

我可以使用.net ThreadPool设置多线程环境,并且确实可以获得显着的性能优势。这在我的应用程序的后台运行。.net 4.0 c#:暂停/恢复线程池中的并行运行线程暂时?

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

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

a。启动较少的后台线程,以便任何新的用户请求获得一定份额的CPU资源。 (但我失去的性能增益我有:()

b。对于螺纹为新用户请求的任务设置更高的优先级。(不知道这是否正常工作?)

角挂起/恢复线程池线程我开始但是暂停/恢复/中断线程强烈劝阻此外,这可能变得棘手,而且容易出错

任何其他的想法

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

在此先感谢!

+0

只需使用一个线程,而不是线程池。 –

回答

0

请注意,线程调度是由CPU完成的,因此不能从程序内定向。只有可以完成的事情是设置ThreadPriority(在新线程上,而不是在ThreadPool线程上)。检查部分Limitations of Using the Thread Pool

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

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

的方法把检查点(由线程池执行)类似于把checkpoints for cancellation support in background worker.