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为间隔的计时器
- 某种装订
一种懒惰且有严重缺陷的方法是添加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()
,作为可能的解决方案。