for (int i = 0; i < 100000; i++) { textBox1.Text += i + " " + "\n"; Thread.Sleep(1000); }
这么一段代码,放在程序里的那简直页面会卡出蛇精病,怎么办呢,用多线程试试
private void button1_Click(object sender, EventArgs e) { Thread t = new Thread(new ThreadStart(er)); t.Start(); richTextBox1.AppendText("eee33"); button1.Text = "..."; } private void er() { this.Invoke(new Action(() => { for (int i = 0; i < 100000; i++) { textBox1.Text += i + " " + "\n"; Thread.Sleep(1000); } })); }
页面:呵呵呵,愚蠢人类,卡死你了吧。
窝:妈蛋,跟你拼了!!
绞尽脑汁中。。。
private void er() { for (int i = 0; i < 100000; i++) { this.Invoke(new Action(() => { textBox1.Text += i + " " + "\n"; Thread.Sleep(1000); })); Thread.Sleep(100); } }
嗯,感觉好了一些,但是好像哪里还是不对的样纸。。。
改成这样:
private void er() { for (int i = 0; i < 100000; i++) { this.Invoke(new Action(() => { textBox1.Text += i + " " + "\n"; Thread.Sleep(5000); })); Thread.Sleep(100); } }
终于发现了它总是一顿一顿的,让你干捉急,然后动用我那脑容量爆棚的大脑,哦,原因是因为this.Invoke是执行在主程序上,所以它一卡,大家都不会有幸福的生活!如果你的代码就是要用这么长时间把数据加载到页面上,呃,这个吗。。这个吗。。。好吧,我们来看另外一种情况,就是 Thread.Sleep(5000);是在做些一些逻辑处理啦,数据库交互啦之类的东东,跟页面上的控件毛线关系都没有,这个时候我们可以这样:
private void er() { for (int i = 0; i < 100000; i++) { Thread.Sleep(5000); this.Invoke(new Action(() => { textBox1.Text += i + " " + "\n"; })); } }
把跟控件没关系的代码从 this.Invoke中移出。机智到没朋友啊,有木有!!!哈哈哈哈!!!但是一想,如果这个代码和控件有有着不可告人的秘密肿么办?
private void erq() { for (int i = 0; i < 100000; i++) { int m = 0; for (int j = 5; j > 0; j--) { m = 100 - i; Thread.Sleep(1000); } this.Invoke(new Action(() => { textBox1.Text += m + " " + "\n"; })); } }
没有异常!好了,窝只能帮你这么多了,页面
其实呢最后就是:
for (int i = 0; i < 100000; i++) { textBox1.Text += i + " " + "\n"; Thread.Sleep(1000); }
转为:
for (int i = 0; i < 100000; i++) { this.Invoke(new Action(() => { textBox1.Text += m + " " + "\n"; })); Thread.Sleep(1000); }