C#的form一用循环就卡死。。。。。

xuxujian 2008-12-17 09:31:41
我在form里加了一个label

然后用了一个for循环,每隔10秒,令label的text值更改一次

但是这样做,form会完全卡死。。。。。。实际中text里也不显示任何值~~~~

该怎么让他不卡呢?

我用了this.label1.Refresh();,但是refresh一用就整个form都更新了

而且更新完,form里还是卡的很,其他按钮根本点不了。。。。。
...全文
992 19 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuxujian 2008-12-17
  • 打赏
  • 举报
回复
谢谢各位的帮忙,还是另开一个线程了,因为label的显示需要一点操作才能获取

再次谢谢
happychou 2008-12-17
  • 打赏
  • 举报
回复
用timer
设定固定的时间来刷新数据进行显示
jmjunta 2008-12-17
  • 打赏
  • 举报
回复
用事件委托就可以了撒。。
ojwftded 2008-12-17
  • 打赏
  • 举报
回复
做死循环的东西最好都不要在主线程做,尤其是可能要sleep阻塞线程的,线程阻塞后就会出现你的那种按钮无法点击,label没有办法刷新的情况。
最好的用一个新的线程去执行要执行的东西。

delegate void RefreshLabelCallback(Control lb, string text);

private void Form1_Load(object sender,EventArgs e)
{
Thread refresh = new Thread(new ThreadStart(Refresh));
refresh.Start();
}
public override void Refresh()
{
RefreshLabel(lable_1,"要刷新的内容");
Thread.Sleep(1000);
}
private void RefreshLabel(Control lb, string text) //其他线程更改非该线程控件会出异常,这种写法是比较好的避免这种异常的写法
{
if (lb.InvokeRequired)
{
RefreshLabelCallback d = new RefreshLabelCallback(RefreshLabel);
this.Invoke(d, new object[] { lb,text });
}
else
{
lb.Text = text;
}
}
lovelan1748 2008-12-17
  • 打赏
  • 举报
回复
timer
wb186 2008-12-17
  • 打赏
  • 举报
回复
呵呵 应该用timer空间好些
        int i = 0;
private void Form1_Load(object sender, EventArgs e)
{
timer1.Enabled = true;
timer1.Interval = 1000;

}

private void timer1_Tick(object sender, EventArgs e)
{
label1.Text = i.ToString();
i++;
}

每1秒就变一下 呵呵
david_anwei 2008-12-17
  • 打赏
  • 举报
回复
启用多线程!
patrickpan 2008-12-17
  • 打赏
  • 举报
回复
另外开一个线程,或者修改label后加上:Application.DoEvents();试试。
zgke 2008-12-17
  • 打赏
  • 举报
回复
循环里使用 Application.DoEvents();

你只是改变控件属性 还是Timer把
swgr17175449 2008-12-17
  • 打赏
  • 举报
回复
因为这个线程是负责UI(图形界面)的,
它的任务主要是处理图形界面的各种事件等等,
很耗时间的循环可以放到BackgroundWorker控件里,然后用它的ProgessChanged事件来修改label的值。
BackgroundWorker是一个很简便的多线程方案。

当然对于楼主的需求,用一个Timer控件会更合适一些。
xuxujian 2008-12-17
  • 打赏
  • 举报
回复
谢谢楼上各位,我去翻翻timer的用法去
awenjie 2008-12-17
  • 打赏
  • 举报
回复
使用Timer组件比使用Thread.sleep()更能满足你的要求!
awenjie 2008-12-17
  • 打赏
  • 举报
回复
在UI线程中对控件进行循环操作时会出现界面等待的情况!

您可以尝试使用在另一线程中使用BeginInvoke来对Lable值进行更新!


在UI上使用BackgroundWorker组件是一种很简单的多线程方案。MSDN上有很简洁的例子。可以看一下!
q704174307 2008-12-17
  • 打赏
  • 举报
回复
用timer控件
xuxujian 2008-12-17
  • 打赏
  • 举报
回复
我用sleep,睡10秒一个
lintf1986 2008-12-17
  • 打赏
  • 举报
回复
不用Timer吗
tianjinldl 2008-12-17
  • 打赏
  • 举报
回复
13楼那样
tianjinldl 2008-12-17
  • 打赏
  • 举报
回复
用委托 + 多线程实现就行了
hernmmy 2008-12-17
  • 打赏
  • 举报
回复
强人都比较多啊,呵呵,我也觉得用新线程比较好点

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧