C# 更改线程优先级以使我的程序和计算机响应更快

C# 更改线程优先级以使我的程序和计算机响应更快,c#,.net,multithreading,thread-priority,C#,.net,Multithreading,Thread Priority,我已经编写了一个.NET winforms应用程序,它使用一个辅助线程来执行一些繁重的处理,从而将其进度反馈给UI线程。一切正常,表单显示进度,我还创建了一个cancel按钮来中断处理线程。然而,当耗时的过程进行时,应用程序和我的整个计算机都会慢下来。拖动窗口需要很长时间,在记事本中输入字母时甚至会有很大的延迟 我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级。是这样吗?现在,两个线程都具有正常优先级 这和下面一样简单吗?或者我还应该做些什么 Thread.CurrentThread

我已经编写了一个.NET winforms应用程序,它使用一个辅助线程来执行一些繁重的处理,从而将其进度反馈给UI线程。一切正常,表单显示进度,我还创建了一个cancel按钮来中断处理线程。然而,当耗时的过程进行时,应用程序和我的整个计算机都会慢下来。拖动窗口需要很长时间,在记事本中输入字母时甚至会有很大的延迟

我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级。是这样吗?现在,两个线程都具有正常优先级

这和下面一样简单吗?或者我还应该做些什么

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

我应该如何改变优先级?我应该降低处理的优先级,还是增加UI的优先级,或者两者兼而有之?去什么地方?高于正常或最高?

您通常希望不使用主线程的优先级,并将处理线程的优先级降低为空闲。

如果希望后台线程不影响整个系统的响应,则需要降低其优先级,最有可能的方法是将其优先级设置为

否则,它将产生与您当前看到的效果相同的效果


尽管如此,我还是会犹豫在我自己的代码中做这件事。如果您的程序在具有更多处理内核的系统上运行,这可能不是问题,降低线程优先级(可能)会导致算法处理时间更长。

我不一定认为线程优先级是您的问题(尽管它可能是问题的一部分)。看看这个问题:

可能是后台线程中的循环太紧,使cpu时间停留在该线程上。有几种方法可以修复它,从残酷的(线程休眠)到更合理的(mutex和事件)


您还可以尝试分析后台线程(直接或在测试工具中)以查看它在哪里花费了大部分时间,并尝试使用异步事件或类似的卸载技术将其隔离。

通常,您应该将工作线程的优先级设置为一个好的级别(例如,用户可能希望在另一个应用程序中执行某些操作,即使是他们,工作线程也应该很好地发挥作用),即使Windows已经提升了“活动”进程线程(您有一个具有输入焦点的窗口的应用程序)稍微有一点,这样它会感觉更灵敏。当你需要满足一些时间限制时,通常需要更高的优先级。

将其设置为空闲将使长时间运行、计算密集型例程可能花费更长的时间。最好将其设置为低于正常值。@Reed:通常两者之间不会有任何区别。区别的唯一方式是,如果有另一个线程处于空闲或低于正常优先级,这两种情况都不是很常见。有相当多的服务设置在低于正常优先级。实际上,我发现我的代码中有明显的区别…@Reed:这听起来很可疑——自Windows NT 3.1以来的整个时间里,我还没有看到一个线程服务设置为以低于正常优先级的优先级运行。即使确实存在这种情况,只有当服务准备好运行时,它才会起作用——当这种情况发生时,它(通常)意味着它已被活动进程调用,在这种情况下,您希望它优先于您的后台线程。还有一个注意事项(不是主要问题):您应该注意,具有不同优先级的线程可能会产生奇怪的并发问题(例如:如果优先级较低的线程抓住了关键部分,并且由于正常或较高优先级的线程占用了整个CPU而不再调度该怎么办)@Ritsaert:Windows调度程序具有“饥饿预防”功能,因此,即使某些内容设置为低优先级,它的优先级也会偶尔“颠簸”,因此它开始运行,并(最终)释放关键部分/互斥体/它所持有的任何内容。@Jerry:感谢添加。我知道较新的Windows版本有这一点,但即使有了它,它也可以长时间持有锁(相对而言)@里萨特:它不再只是“新的”Windows版本——IIRC,它是在NT 4.0时间范围内推出的。@Ritsaert:这篇文章很有趣,但它指出了错误的方向。如果你仔细看,他提到了进程休眠——这是问题的真正根源。线程同步应该与WaitForSingleObject之类的东西进行,而不是与sleep进行。如果chan调整优先级会改变整体行为,很可能你的代码是错误的,这只是因为调度程序有很多辅助工具(但它只能对正常/动态优先级线程使用大部分辅助工具)。如果工作真的是“繁重的处理”,然后尝试使用互斥锁和事件等,只会大大降低处理速度。充分使用CPU并不是一件坏事-不必要地使用它是一个问题…这取决于“重处理”的定义.我同意你的看法,但是里德,如果你已经投入了大量资金,那么增加额外的上下文切换只会让事情变得更糟。不过,根据我的经验,有时会小心地应用工作分段(使用互斥体和信号)可以减轻处理器争用,但不会显著影响速度,尽管总会有一些损失。Eric,您的开发人员机器中有什么类型的处理器?工作线程多久与UI通信一次?