线程优先级

4

ThreadPriority.LowestThreadPriority.BelowNormal之间有多大的差异。

我该如何选择?我有一些需要大量CPU计算的任务,但我不想影响应用程序的其他部分。

更新

作业是从System.Threading.Timer调用的。在回调方法返回之前,我必须重置线程优先级,还是.Net会处理它?

5个回答

3
达林和马特的回答完全正确,可能也很全面。我只是在这里补充一些额外的话:p 基本思想是优先级只有在彼此之间才真正具有意义。较低优先级的工作(有效地)不会得到完成,直到没有更高优先级需要完成的工作为止。这就是为什么将进程/线程的优先级提高太高是如此危险 - 您可能会有效地锁定系统的其余部分。
还要注意您的线程优先级会影响系统的其余部分 - 不仅仅是您的应用程序的其余部分。但也请注意,操作系统本身可以自由调整线程的相对优先级(这就是为什么我一直使用“有效地”这个词)。

将线程优先级设置为较低不仅会改变它在应用程序中的处理方式,还会相对于其他进程中的线程产生影响吗? - jgauffin
2
@jgauffin - 当然可以;但要记住操作系统可以根据自己的需要对任何进程中的线程进行调整。但这就是为什么例如Windows任务管理器(taskmgr.exe)将其默认优先级设置为“高”的原因;因此,即使系统由于某个失控程序导致CPU使用率达到100%,其中的线程仍有更大的运行机会。 - Andrew Barber

1

你看过了吗?MSDN线程优先级

线程的执行顺序是根据它们的优先级进行调度的。用于确定线程执行顺序的调度算法因操作系统而异。操作系统还可以根据用户界面的焦点在前台和后台之间移动来动态调整线程优先级。

针对你的问题:

最低 线程可以在任何其他优先级的线程之后被调度。

BelowNormal 线程可以在具有普通优先级的线程之后和具有最低优先级的线程之前被调度。


1

文档看起来很清晰。如果你想让线程在任何其他优先级的线程之后被调度,请使用Lowest。如果你想让线程在Normal优先级的线程之后和Lowest优先级的线程之前被调度,请使用BelowNormal


那么只有在我为应用程序中的其他线程指定了优先级时才会产生影响? - jgauffin
是的,请记住,.Net 也会为您的应用程序创建其他线程,例如垃圾回收等。 - Ignacio Soler Garcia

1

设置线程优先级时要小心。

虽然您不希望进程影响应用程序的响应能力,但通过降低线程优先级,可能意味着线程完成所需的时间更长。这可能会对应用程序产生明显更严重的影响,因为用户更明显地在等待它完成。

您应该测试在不同负载的不同机器上改变优先级的效果。将优先级设置为最低将对线程的执行时间产生显著影响。

您还可以考虑提供一个选项(可能在某种程度上是隐藏的),允许用户控制线程优先级(或至少在2或3个中间值之间选择)。


感谢您提出这些问题,但是这项工作是在一个Windows服务/COM+应用程序中进行的,时间不是问题。 - jgauffin

1

选择哪一个取决于您的情况,但我是这样看待它的:

如果进程完全在后台运行并且不太关键,则选择最低。

如果进程需要发生,但时间不关键,则选择低于正常。

如果进程与其他所有内容一样重要,则选择正常。

我尽量不使用更高的优先级,我的程序并不那么重要 :)

至于差异,这取决于正在运行的代码以及操作系统决定如何处理优先级,它不需要听取您设置的优先级。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接