GUI没有更新定时器或后台工作者

本文关键字:后台 工作者 定时器 更新 GUI | 更新日期: 2023-09-27 18:04:58

我试图每秒钟更新一个GUI。我试过System.Timers。计时器,System.Windows.Forms。Timer和BackgroundWorker。不行。我显然漏掉了什么。

我尝试使用BackgroundWorker:

public partial class Form1 : Form
{
    List<int> counts = new List<int>() { 0, 0, 0, 0, 0, 0, 0, 0 };
    List<long> complete = new List<long>() { 0, 0, 0, 0, 0, 0, 0, 0 };

    private void button1_Click(object sender, EventArgs e)
    {
        var backgroundWorker = new BackgroundWorker();
        backgroundWorker.DoWork += new DoWorkEventHandler(UpdateGUI);
        backgroundWorker.RunWorkerAsync();
        // Do stuff that updates counts and complete
        backgroundWorker.CancelAsync();
    }
    private void UpdateGUI(object sender, EventArgs e)
    {
        var backgroundWorker = sender as BackgroundWorker;
        while (backgroundWorker.CancellationPending == false)
        {
            label1.Text = count.ToString();
            labelF1.Text = counts[0].ToString();
            labelF2.Text = counts[1].ToString();
            labelF3.Text = counts[2].ToString();
            labelF4.Text = counts[3].ToString();
            labelF5.Text = counts[4].ToString();
            labelF6.Text = counts[5].ToString();
            labelF7.Text = counts[6].ToString();
            labelF8.Text = counts[7].ToString();

            labelC1.Text = complete[0].ToString();
            labelC2.Text = complete[1].ToString();
            labelC3.Text = complete[2].ToString();
            labelC4.Text = complete[3].ToString();
            labelC5.Text = complete[4].ToString();
            labelC6.Text = complete[5].ToString();
            labelC7.Text = complete[6].ToString();
            labelC8.Text = complete[7].ToString();
            Application.DoEvents();
            Thread.Sleep(1000);
        }
    }
}

GUI没有更新定时器或后台工作者

试试这个

public partial class Form1 : Form
{
List<int> counts = new List<int>() { 0, 0, 0, 0, 0, 0, 0, 0 };
List<long> complete = new List<long>() { 0, 0, 0, 0, 0, 0, 0, 0 };

private void button1_Click(object sender, EventArgs e)
{
    var backgroundWorker = new BackgroundWorker();
    backgroundWorker.DoWork += new DoWorkEventHandler(UpdateGUI);
    backgroundWorker.RunWorkerCompleted += backgroundWorker_RunWorkerCompleted 
    backgroundWorker.RunWorkerAsync();
    // Do stuff that updates counts and complete
    //backgroundWorker.CancelAsync();
}
private void UpdateGUI(object sender, EventArgs e)
{
        Thread.Sleep(1000);
}
private void backgroundWorker.RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
   var backgroundWorker = sender as BackgroundWorker;
        label1.Text = count.ToString();
        labelF1.Text = counts[0].ToString();
        labelF2.Text = counts[1].ToString();
        labelF3.Text = counts[2].ToString();
        labelF4.Text = counts[3].ToString();
        labelF5.Text = counts[4].ToString();
        labelF6.Text = counts[5].ToString();
        labelF7.Text = counts[6].ToString();
        labelF8.Text = counts[7].ToString();

        labelC1.Text = complete[0].ToString();
        labelC2.Text = complete[1].ToString();
        labelC3.Text = complete[2].ToString();
        labelC4.Text = complete[3].ToString();
        labelC5.Text = complete[4].ToString();
        labelC6.Text = complete[5].ToString();
        labelC7.Text = complete[6].ToString();
        labelC8.Text = complete[7].ToString();
        Application.DoEvents();
   }
 }