我编写了一个.NET winforms应用程序,它使用辅助线程进行一些繁重的处理,将其进程传回UI线程。一切正常,表单显示进度,我还创建了一个取消按钮来中断处理线程。但是,当耗时的过程进入应用程序时,我的整个计算机都会慢下来。拖动窗户需要很长时间,尝试在记事本中输入字母时甚至会有明显的延迟。
我假设我需要降低处理线程的优先级,和/或增加UI线程的优先级。这是正确的吗?现在两个线程都是普通优先级。
它和下面的一样容易吗?或者我还应该做些什么呢?
Thread.CurrentThread.Priority = ThreadPriority.AboveNormal;
我应该如何改变优先顺序?我应该降低处理的优先级,还是提高UI的优先级,或两者兼而有之?到了什么环境?高于正常,还是最高?
答案 0 :(得分:5)
我不一定认为线程优先级是你的问题(虽然它可能是它的一部分)。看看这个问题:Background Worker Thread Priority。
在后台线程中可能过于紧密的循环会在该线程上保持cpu时间。有几种方法可以将它从残酷的(线程睡眠)修复到更合理的(互斥和事件)。
您还可以尝试分析后台线程(直接或在测试工具中)以查看它花费大部分时间的位置,并尝试使用异步事件或类似的卸载技术来隔离它。
答案 1 :(得分:2)
如果您希望后台线程不会影响整体的系统响应能力,您需要降低其优先级,最有可能的是将其优先级设置为BelowNormal。
否则,它将具有您目前看到的相同效果。
话虽这么说,我会在自己的代码中犹豫不决。如果您的程序在具有更多处理核心的系统上运行,这可能不是问题,并且降低线程优先级(可能)将导致您的算法需要更长的时间来处理。
答案 2 :(得分:0)
您通常希望单独保留主线程的优先级,并将处理线程的优先级降低到空闲状态。
答案 3 :(得分:0)
通常你应该将工作线程的优先级设置为一个很好的级别(例如,用户可能想要在另一个应用程序中执行某些操作,即使它们工作线程也应该很好),即使Windows已经提升了“活动”进程线程(你有一个带有输入焦点的窗口的应用程序)一点点,所以它会感觉更敏感。当您需要满足一些时间限制时,通常需要更高的优先级。