8

我编写了一个 .NET winforms 应用程序,该应用程序使用辅助线程进行一些繁重的处理,将其进度传达回 UI 线程。一切正常,表单显示进度,我还创建了一个取消按钮来中断处理线程。但是,当耗时的过程正在进行应用程序时,我的整个计算机就会变慢。拖动窗口需要很长时间,尝试在记事本中输入字母时甚至会出现明显的延迟。

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

是不是跟下面的一样简单?或者还有什么我应该做的吗?

Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;

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

4

4 回答 4

5

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

后台线程中的循环可能过于紧密,导致该线程上的 CPU 时间保持不变。有几种方法可以将其从残酷的(线程休眠)修复到更合理的(互斥锁和事件)。

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

于 2010-02-09T19:38:43.303 回答
2

如果您希望后台线程不影响整个系统的响应能力,则需要降低它的优先级,很可能通过将其优先级设置为低于正常

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

话虽如此,我会犹豫是否在自己的代码中执行此操作。如果您的程序在具有更多处理核心的系统上运行,这可能不会成为问题,并且降低线程优先级(可能)会导致您的算法需要更长的时间来处理。

于 2010-02-09T19:38:35.710 回答
0

您通常希望单独保留主线程的优先级,并将处理线程的优先级降低到 Idle。

于 2010-02-09T19:38:07.470 回答
0

通常你应该将工作线程的优先级设置为一个不错的级别(例如,用户可能想在另一个应用程序中做一些事情,即使他们工作线程应该玩得很好)即使 Windows 已经提升了“活动”进程线程(应用程序你有一个输入焦点的窗口)一点点,所以它会感觉更敏感。当您需要满足一些时间限制时,通常需要更高的优先级。

于 2010-02-09T19:38:47.800 回答