簡體   English   中英

C#backgroundworker循環更改標簽文本

[英]C# backgroundworker loop change label text

我的表單中有一個Label ,並且想要每秒更改其文本。 我以為我需要BackgroundWorker但是其中的while循環似乎不起作用。 循環的第一行完成了工作,但是在Thread.Sleep ,循環似乎停止了。

public MainForm()
{           

    InitializeComponent();

    backgroundWorker1.DoWork += new DoWorkEventHandler(getFrame);

    backgroundWorker1.RunWorkerAsync();
}

void getFrame(object sender, DoWorkEventArgs e)
{
    while(true) {
        ageLabel.Text = "test";
        Thread.Sleep(1000);
        ageLabel.Text = "baa";
        Thread.Sleep(1000);
    }
}

而是使用Timer 考慮以下示例,其中label1是WinForm上的一個簡單Label控件:

public partial class Form1 : Form
{
    Timer _timer = new Timer();

    public Form1()
    {
        InitializeComponent();

        _timer.Interval = 1000;
        _timer.Tick += _timer_Tick;
        _timer.Start();
    }

    private void _timer_Tick(Object sender, EventArgs e)
    {
        label1.Text = DateTime.Now.ToString();
    }
}

發生停止是因為您遇到System.InvalidOperationException異常,該異常是由於您嘗試從與創建控件元素不同的線程中操作控件元素而發生的。

為了解決您的問題,您可以使用Control.BeginInvoke 此方法將拉動主線程上的控件操縱的執行:

while (true)
{
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "test"; }));
    Thread.Sleep(1000);
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "bla"; }));
    Thread.Sleep(1000);
}

如果在Visual Studio中使用Windows窗體,建議查看輸出窗口 諸如此類的異常將在此處顯示。 :)

編輯:如果您只想按一定的時間間隔更新UI組件屬性,則也可以使用Timer ,它是為此目的而構建的。 它在主UI線程上執行,因此不需要任何調用。

但是總的來說,這種想法仍然成立,如果您想從一個不同於創建線程的線程中操縱一個控件,那么您就需要調用!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM