【发布时间】:2012-01-05 12:44:18
【问题描述】:
我正在尝试更改线程的优先级,但无法使其正常工作。我制作了一个按钮,可以在低和高之间切换优先级,当我在作业列表中检查时,优先级会发生变化。但是CPU使用率没有改变。我想知道这是否只是因为我没有使用完整的 CPU 能力,或者这是怎么回事。
我不是在问这是否是个好主意。我在问怎么做。
这是我更改优先级的方法。这是类后面的代码:
private Thread tr;
public MainWindow()
{
InitializeComponent();
tr = new Thread(new ThreadStart(infiniteLoop));
tr.Start();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
if (Process.GetCurrentProcess().PriorityClass == ProcessPriorityClass.High)
{
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.Idle;
tr.Priority = ThreadPriority.Lowest;
description.Text = "Idle";
}
else
{
Process.GetCurrentProcess().PriorityClass = ProcessPriorityClass.High;
tr.Priority = ThreadPriority.Highest;
description.Text = "High";
}
}
private void infiniteLoop()
{
while (true)
{
}
}
【问题讨论】:
-
搞乱线程或进程优先级通常是个坏主意。
-
@Nicholas Butler:哦,我明白了,微软公开线程管理 API 只是为了好玩 :)
-
@IgorKorkhov 他说的是一般地,而不是无条件地。这个问题被标记为
wpf- 它不会向我尖叫“我需要高级线程调度”。 -
它确实有它的用途。在机器经常满载/过载的环境中(即当就绪线程的数量通常大于 CPU 内核的数量时),提高 I/O 绑定进程/线程的优先级可以帮助进程保持紧密吞吐量/延迟目标,同时对没有此类硬限制的其他 CPU 密集型应用程序的影响最小。无论如何,许多操作系统都会将优先级提升应用于在 I/O 驱动程序中断后准备就绪的线程,只是为了自动促进这种优化。
-
请注意:我这样做非常罕见,应格外小心(例如防止线程饥饿)。
标签: c# wpf multithreading thread-priority