一个按钮中,
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
this.Text = string.Format("{0}/{1}",i,1000);
}如果这样写程序会卡死,请问,怎么更新进度,谢谢.
for (int i = 0; i < 1000; i++)
{
Console.WriteLine(i);
Thread.Sleep(100);
this.Text = string.Format("{0}/{1}",i,1000);
}如果这样写程序会卡死,请问,怎么更新进度,谢谢.
首先楼主要有线程的概念,你这段代码是在主线程中执行的,同时主线程也是UI线程,这样在这段代码执行完之前主线程是没有机会去刷新UI的。两个办法
1,工作放到主线程之外的线程里面做,然后通过事件,或者轮询的方式更新完成进度。
2,另一种方式就是在主线程里面做,每次循环之后都做一次DoEvents,这样给主线程一个机会去刷新UI。个人推荐第一种方式,因为这才是正规的做法。第二种方式其实是一种偷懒的做法,因为工作还是在主线程里面做,所以在工作结束之前主线程都会繁忙,对于UI来说,这种做法很不好。
http://blog.csdn.net/kenkao/article/details/5688557
{
this.Text = string.Format("{0}/{1}",i,1000);
});
method();
});
th.Start();
不死么....为何要用Thread.Sleep(100); 这个呢?
1、窗体this.Refresh();强制重新绘制
2、backgroundworker组件
3、委托一个新线程去处理循环体 public void test()
{
int i=0;
while (i<100000)
{
this.Invoke
(
(MethodInvoker)delegate()
{
label1.Text = i.ToString();
}
);
i += 100;
}
}
private void button1_Click(object sender, EventArgs e)
{
i = 0;
Thread th = new Thread((ThreadStart)delegate()
{
test();
});
th.Start();
}
不要一看到Thread就是多线程