我有一个非常简单的C#程序(.net 4.5,VS 2013),它使用Winforms获取当前的CPU速度和最大CPU速度,并更新以下标签:
lblCPUMaxValue
lblCPUCurrentValue我创建了一个名为timerCPUstats的计时器,它每3000 the计时一次,并调用函数updatePerfInfo():
public uint CPUSpeed()
{
ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
uint speed = (uint)(Mo["CurrentClockSpeed"]);
Mo.Dispose();
return speed;
}
public uint maxCPUSpeed()
{
ManagementObject Mo = new ManagementObject("Win32_Processor.DeviceID='CPU0'");
uint speed = (uint)(Mo["MaxClockSpeed"]);
Mo.Dispose();
return speed;
}
public string formatMhzGhz(uint mhz)
{
decimal ghz = (decimal)mhz / 1000;
ghz = Math.Round(ghz, 2);
string stringGhz = ghz.ToString() + " GHz";
return stringGhz;
}
public void updatePerfInfo()
{
lblCPUMaxValue.Text = formatMhzGhz(maxCPUSpeed());
lblCPUCurrentValue.Text = formatMhzGhz(CPUSpeed());
}问题是每次标签更新程序都会冻结几秒钟。它基本上变成了非交互/冻结。有办法绕道吗?
发布于 2014-02-10 15:32:33
通过在UI线程中执行长时间运行的非UI工作来阻塞UI线程。您需要将该工作卸载到另一个线程,然后用该工作的结果更新UI。
BackgroundWorker是专门为这个精确的操作而设计的。在Result事件处理程序中计算DoWork并设置结果,然后使用RunWorkerCompleted事件处理程序将Result显示给UI。
如果您使用的是C# 5.0,则另一个选项是使用await,这将允许您编写:
public async void updatePerfInfo()
{
lblCPUMaxValue.Text = await Task.Run(()=>formatMhzGhz(maxCPUSpeed()));
lblCPUCurrentValue.Text = await Task.Run(()=>formatMhzGhz(CPUSpeed()));
}https://stackoverflow.com/questions/21681174
复制相似问题