C#的form一用循环就卡死。。。。。 我在form里加了一个label然后用了一个for循环,每隔10秒,令label的text值更改一次但是这样做,form会完全卡死实际中text里也不显示任何值~~~~该怎么让他不卡呢?我用了this.label1.Refresh();,但是refresh一用就整个form都更新了而且更新完,form里还是卡的很,其他按钮根本点不了。。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 在UI线程中对控件进行循环操作时会出现界面等待的情况! 您可以尝试使用在另一线程中使用BeginInvoke来对Lable值进行更新!在UI上使用BackgroundWorker组件是一种很简单的多线程方案。MSDN上有很简洁的例子。可以看一下! 使用Timer组件比使用Thread.sleep()更能满足你的要求! 谢谢楼上各位,我去翻翻timer的用法去 因为这个线程是负责UI(图形界面)的,它的任务主要是处理图形界面的各种事件等等,很耗时间的循环可以放到BackgroundWorker控件里,然后用它的ProgessChanged事件来修改label的值。BackgroundWorker是一个很简便的多线程方案。当然对于楼主的需求,用一个Timer控件会更合适一些。 循环里使用 Application.DoEvents();你只是改变控件属性 还是Timer把 另外开一个线程,或者修改label后加上:Application.DoEvents();试试。 呵呵 应该用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秒就变一下 呵呵 做死循环的东西最好都不要在主线程做,尤其是可能要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; } } 用timer设定固定的时间来刷新数据进行显示 谢谢各位的帮忙,还是另开一个线程了,因为label的显示需要一点操作才能获取再次谢谢 求一个正则表达式 我的vs2008智能提示显示异常,而且智能提示是英文的。 wince问题,写文件时中文出现乱码 请教一个小小的问题 在WPF中使用webBrowser,如何设置元素焦点,如何自点击 开了多线程,如何判断各个线程都执行好了? 在winform中这样的下拉框,输入字符同时就显示一个下拉列表,里面是匹配的选项? C# 向ORACLE数据库中插入数据的问题 求助~ C# OpenXml Word操作,着急呀!! c#同时连接两个串口出现问题,请大神帮忙!感谢 C#中如何截取系统时间??? URL重写
在UI上使用BackgroundWorker组件是一种很简单的多线程方案。MSDN上有很简洁的例子。可以看一下!
它的任务主要是处理图形界面的各种事件等等,
很耗时间的循环可以放到BackgroundWorker控件里,然后用它的ProgessChanged事件来修改label的值。
BackgroundWorker是一个很简便的多线程方案。当然对于楼主的需求,用一个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秒就变一下 呵呵
最好的用一个新的线程去执行要执行的东西。 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;
}
}
设定固定的时间来刷新数据进行显示