如何在C#循环期间多次更改控件的属性

时间:2011-07-02 18:57:31

标签: c#

我正在尝试做这样的事情:

int i;
while(true)
{
    label1.Text = i.ToString();
    i++;
    Thread.Sleep(500);
}

(实际上我正在尝试做一些更复杂的事情,这更有意义,但这只是我问题的一个简单例子) 我期待标签的文字每1/2秒改变一次......但是它会卡住。

谢谢你

6 个答案:

答案 0 :(得分:5)

你不能让GUI-Thread睡眠(因为GUI不会响应)(我说即使我喜欢睡觉* 很多 *)。

考虑以下其中一种选择:

  • 在单独的线程上运行此代码
  • 创建一个以500为间隔的计时器
  • 某种绑定

答案 1 :(得分:3)

暂停UI线程会使事情更糟,因为在完成方法之前它无法响应“绘制”事件。

这里最合适的选择是计时器,在每个刻度上做一些工作。

一种懒惰而且存在严重缺陷的方法是添加Application.DoEvents() - 我只提这个让我说不要这样做!!!

答案 2 :(得分:0)

使用后台线程或计时器,否则您将阻止UI:

Thread t = new Thread( () =>
{
    int i = 0;
    while (true)
    {
        label1.Invoke( new Action(() => { label1.Text = i.ToString();}));
        i++;
        Thread.Sleep(500);
    };   
});
t.IsBackground = true;
t.Start();

答案 3 :(得分:0)

现在你的方式,你的代码在与GUI相同的线程上运行。设置新标签文本后,您立即进入睡眠状态,这会阻止任何负责实际更新屏幕的代码运行。您可以在睡眠呼叫之前放置Application.DoEvents()以强制它处理任何消息,但这不是真正的解决方案。

您需要做的是将耗时的代码放在不同的线程上。 .NET Timer类是为这样简单的东西而制作的。您也可以创建包含循环代码的独立线程。只需确保您只能从创建它的同一个线程访问该标签。您可以通过将委托传递给进行实际文本更新的label1.Invoke来完成此任务。

答案 4 :(得分:-1)

你的循环没有中断条件

也许你正在尝试做,看到调用Update来重新标记标签。

int i; 
for (i=0; i!=10; i++){ 
        label1.Text = i.ToString();
        label1.Update();
        Thread.Sleep(500); 
}

答案 5 :(得分:-1)

你永远不会离开while循环,因此卡住了部分。此外,如果这是一个WinForm,您需要重新绘制/无效/刷新您的UI以查看任何更新。有关详细信息,请访问:C#: How do I repaint my form when it's not focused?