0

这是代码:

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();
                                }));

所以我认为正确的方法是使用进度报告并在进度报告事件中使用此 listBox 更新。而不是在 DoWork 事件中调用 cpuView 和 gpuView。

4

1 回答 1

2
    blinking_label();

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

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

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

于 2013-03-07T22:58:06.703 回答