这是代码:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (true)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
{
soundPlay = true;
blinking_label();
NudgeMe();
}
else
{
soundPlay = false;
stop_alarm = true;
}
backgroundWorker1.ReportProgress(
}
}
}
我应该在这里放置或使用什么:backgroundWorker1.ReportProgress
(
我没有任何进度条或其他东西。我该怎么办?
在此之前,DoWork事件是这样的:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = sender as BackgroundWorker;
while (true)
{
if ((worker.CancellationPending == true))
{
e.Cancel = true;
break;
}
else
{
if (tempCpuValue >= (float?)nud1.Value || tempGpuValue >= (float?)nud1.Value)
{
soundPlay = true;
blinking_label();
NudgeMe();
}
else
{
soundPlay = false;
stop_alarm = true;
}
cpuView();
gpuView();
//Thread.Sleep(1000);
}
}
}
我在cpuView()里面有:
this.Invoke(new Action(() =>
{
data = new List<string>();
data.Add("Gpu Temeprature --- " + sensor.Value.ToString());
listBox1.DataSource = null;
listBox1.DataSource = data;
listBox1.Invalidate();
}));
所以我认为正确的方法是使用progrees报告并在progress报告事件中使用此listBox更新。而不是在DoWork事件中调用cpuView和gpuView。
答案 0 :(得分:2)
blinking_label();
您无法使后台工作人员的标签闪烁。因此,最好使用ReportProgress()来运行闪烁标签的代码。该方法不仅有助于报告进度,还具有在UI线程上运行代码的通用功能。
你需要做些什么来避免一遍又一遍地眨眼和轻推,例如睡一会儿。你不能让Sleep()呼叫注释掉。这段代码非常适合Timer的Elapsed事件处理程序而不是worker。这也将确保您使用用于更有效地运行此代码的线程池线程。然后使用Control.BeginInvoke()在UI线程上运行代码。
此外,由于获得cpu温度应该非常便宜,因此您很可能根本不需要线程池线程。这允许使用常规winforms Timer,现在一切都变得简单。