Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C backgroundworker循环更改标签文本_C#_Loops_Backgroundworker - Fatal编程技术网

C# C backgroundworker循环更改标签文本

C# C backgroundworker循环更改标签文本,c#,loops,backgroundworker,C#,Loops,Backgroundworker,我的表单中有一个标签,希望每秒更改它的文本。我认为我需要一个后台工作人员,但其中的while循环似乎不起作用。循环中的第一行完成了它的工作,但是在一个线程之后。睡眠循环似乎停止了 public MainForm() { InitializeComponent(); backgroundWorker1.DoWork += new DoWorkEventHandler(getFrame); backgroundWorker1.RunWorkerAs

我的表单中有一个标签,希望每秒更改它的文本。我认为我需要一个后台工作人员,但其中的while循环似乎不起作用。循环中的第一行完成了它的工作,但是在一个线程之后。睡眠循环似乎停止了

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);
    }
}
取而代之的是,使用一个。考虑这个例子,其中Label1是Win窗体上的一个简单的标签控件:

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();
    }
}
取而代之的是,使用一个。考虑这个例子,其中Label1是Win窗体上的一个简单的标签控件:

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异常,该异常是因为您尝试从创建控件元素时所在的线程以外的线程操作控件元素而发生的

要解决您的问题,您可以使用。此方法将在主线程上拉动控件操作的执行:

while (true)
{
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "test"; }));
    Thread.Sleep(1000);
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "bla"; }));
    Thread.Sleep(1000);
}
如果在VisualStudio中使用windows窗体,建议查看。类似于此的例外情况将在此处显示:

编辑:如果您只是想按一定的时间间隔更新UI组件属性,那么您也可以使用,它就是为此而构建的。它在主UI线程上执行,因此不需要任何调用


但总的来说,这个想法仍然成立,如果你想从一个不同的线程操作一个控件,而不是创建它,那么你需要调用它

发生停止是因为您遇到System.InvalidOperationException异常,该异常是因为您试图从创建控件元素的线程以外的线程操作控件元素而发生的

要解决您的问题,您可以使用。此方法将在主线程上拉动控件操作的执行:

while (true)
{
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "test"; }));
    Thread.Sleep(1000);
    ageLabel.BeginInvoke(new Action(() => { ageLabel.Text = "bla"; }));
    Thread.Sleep(1000);
}
如果在VisualStudio中使用windows窗体,建议查看。类似于此的例外情况将在此处显示:

编辑:如果您只是想按一定的时间间隔更新UI组件属性,那么您也可以使用,它就是为此而构建的。它在主UI线程上执行,因此不需要任何调用


但总的来说,这个想法仍然成立,如果你想从一个不同的线程操作一个控件,而不是创建它,那么你需要调用它

用定时器代替。我也会投票给定时器。或者,如果你仍然想使用后台工作程序,最好使用Task.Run=>{..你的任务在这里…Task.Delay1000..你的下一个任务在这里…}使用计时器。我也会投票支持计时器。或者,如果你仍然想使用后台工作程序,你最好使用Task.Run=>{..你的任务在这里…Task.Delay1000..你的下一个任务在这里…}为什么计时器解决方案有帮助?@MongZhu问错了。为什么这么简单的任务需要背景工作人员?需要调用UI只能证明它是错误的方法。我的问题怎么可能是错误的?还是这又是一个错误的问题?我想向您解释为什么您的解决方案有效,而OP提供的解决方案无效。你的回答根本不涉及这篇文章的问题。为什么问题会首先出现?@MongZhu System.Windows.Forms.Timer在UI线程上触发事件,因此不需要启动。@AlexM。这里根本不需要使用线程。为什么计时器解决方案有帮助?@MongZhu问错了。为什么这么简单的任务需要背景工作人员?需要调用UI只能证明它是错误的方法。我的问题怎么可能是错误的?还是这又是一个错误的问题?我想向您解释为什么您的解决方案有效,而OP提供的解决方案无效。你的回答根本不涉及这篇文章的问题。为什么问题会首先出现?@MongZhu System.Windows.Forms.Timer在UI线程上触发事件,因此不需要启动。@AlexM。在这里使用线程是完全没有必要的。这是完全没有必要的。后台线程用于CPU密集型操作,以便不干扰UI。OP的需求,顾名思义,是一个UI操作,那么为什么要将它发送给线程呢,只需要将其封送回UI?有趣的是,看到真正正确的答案没有任何错误upvotes@DonBoitnott问题很清楚地表明OP正在学习如何处理后台线程和与GUI交互。下次他尝试CPU密集型操作并更新GUI以显示他将运行的进度完全相同的问题。仍然不知道为什么它不起作用。在这种情况下,计时器解决方案可能会有所帮助,但在我的建议中,一个好的答案应该能够解决核心问题并教授一个lesson@Mong朱-这绝对值得作为一个开始来解释事情是如何运作的,但是,在这种CPU不密集的情况下,添加计时器是一种更简单/优化的解决方案,这难道没有意义吗?@AlexM在这里使用计时器是非常有意义的。在这一点上我从来没有意见分歧。我编辑了我的答案,将其也纳入其中。想象一下,你试着种植食物,然后你走向某人说:I tr
我想在冬天种土豆,但土豆长不出来,他会回答:这是20美元,去买一些吧。你对种植食物了解多少?这完全没有必要。后台线程用于CPU密集型操作,以便不干扰UI。OP的需求,顾名思义,是一个UI操作,那么为什么要将它发送给线程呢,只需要将其封送回UI?有趣的是,看到真正正确的答案没有任何错误upvotes@DonBoitnott问题很清楚地表明OP正在学习如何处理后台线程和与GUI交互。下次他尝试CPU密集型操作并更新GUI以显示他将运行的进度完全相同的问题。仍然不知道为什么它不起作用。在这种情况下,计时器解决方案可能会有所帮助,但在我的建议中,一个好的答案应该能够解决核心问题并教授一个lesson@Mong朱-这绝对值得作为一个开始来解释事情是如何运作的,但是,在这种CPU不密集的情况下,添加计时器是一种更简单/优化的解决方案,这难道没有意义吗?@AlexM在这里使用计时器是非常有意义的。在这一点上我从来没有意见分歧。我编辑了我的答案,将其也纳入其中。想象你试着种植食物,然后你去找某人说:我试着在冬天种土豆,但它不长,他会回答:这是20美元,去买一些吧。你对种植食物了解多少?