C# 如何在C中的循环过程中多次更改控件的属性#

C# 如何在C中的循环过程中多次更改控件的属性#,c#,C#,我正在尝试这样做: int i; while(true) { label1.Text = i.ToString(); i++; Thread.Sleep(500); } (实际上,我正在尝试做一些更复杂的事情,这更有意义,但这只是我问题的一个简单例子) 我希望标签的文字每1/2秒就改变一次,但它被卡住了 谢谢你你的循环没有中断条件 也许您正在尝试这样做,请查看调用更新以重新绘制标签 int i; for (i=0; i!=10; i++){ labe

我正在尝试这样做:

int i;
while(true)
{
    label1.Text = i.ToString();
    i++;
    Thread.Sleep(500);
}
(实际上,我正在尝试做一些更复杂的事情,这更有意义,但这只是我问题的一个简单例子) 我希望标签的文字每1/2秒就改变一次,但它被卡住了


谢谢你

你的循环没有中断条件

也许您正在尝试这样做,请查看调用更新以重新绘制标签

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

您不能让GUI线程睡眠(因为GUI不会响应)(我是说,尽管我非常喜欢睡眠*

考虑以下备选方案之一:

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

您将永远无法摆脱while循环,因此无法摆脱卡住的部分。此外,如果这是一个WinForm,您需要重新绘制/失效/刷新UI以查看任何更新。这里有更多信息:

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

这里最合适的选择是一个计时器,在每个滴答声上做一些工作


一种懒惰且有严重缺陷的方法是添加Application.DoEvents()-我提到这一点只是为了允许我说不要这样做

使用后台线程或计时器,否则将阻止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();

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


您需要做的是将耗时的代码放在不同的线程上。NET定时器类是为这样简单的东西而设计的。您还可以创建包含循环代码的单独线程。只需确保您只能从创建标签的同一线程访问标签。您可以通过将委托传递给
label1来完成此操作。调用执行实际文本更新的

您可以提供更多信息吗;至于它在哪里被卡住或代码块?使用断点并查看它在哪里被卡住…f10和f11应该解决您的问题NoNoNoNoNoNoNoNon不要休眠UI线程@alex,你能告诉我们你的要求吗?我们可以建议你一些更好的设计或解决方案。添加label1.Update()。这并不能阻止用户界面变得紧张,“无响应”鬼窗口出现。使用计时器或后台工作人员。@james,他刚刚发布了示例代码,他的意思不是说,虽然是infinte循环,但问题是在主GUI线程上睡眠是的,在GUI线程上睡眠是个不错的主意,它肯定会出问题。最好不要提及
Application.DoEvents()
,作为可能的解决方案。