我正在尝试做这样的事情:
int i;
while(true)
{
label1.Text = i.ToString();
i++;
Thread.Sleep(500);
}
(实际上我正在尝试做一些更复杂的事情,这更有意义,但这只是我问题的一个简单例子) 我期待标签的文字每1/2秒改变一次......但是它会卡住。
谢谢你
答案 0 :(得分:5)
你不能让GUI-Thread睡眠(因为GUI不会响应)(我说即使我喜欢睡觉* 很多 *)。
考虑以下其中一种选择:
答案 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?