我应该报告什么来报告后台工作DoWork活动的进展?

时间:2013-03-07 22:47:40

标签: c#

这是代码:

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。

1 个答案:

答案 0 :(得分:2)

    blinking_label();

您无法使后台工作人员的标签闪烁。因此,最好使用ReportProgress()来运行闪烁标签的代码。该方法不仅有助于报告进度,还具有在UI线程上运行代码的通用功能。

你需要做些什么来避免一遍又一遍地眨眼和轻推,例如睡一会儿。你不能让Sleep()呼叫注释掉。这段代码非常适合Timer的Elapsed事件处理程序而不是worker。这也将确保您使用用于更有效地运行此代码的线程池线程。然后使用Control.BeginInvoke()在UI线程上运行代码。

此外,由于获得cpu温度应该非常便宜,因此您很可能根本不需要线程池线程。这允许使用常规winforms Timer,现在一切都变得简单。