博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
c#多线程2
阅读量:6499 次
发布时间:2019-06-24

本文共 2847 字,大约阅读时间需要 9 分钟。

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); }

  还有一种方法可以使用

for (int i = 0; i < 10000; i++)

{   textBox1.Text += i ;

Application.DoEvents();

}

 

 

转载于:https://www.cnblogs.com/paidaxing/p/3807591.html

你可能感兴趣的文章
Navicat for Oracle
查看>>
配置文件的简单使用
查看>>
K-Means聚类算法原理
查看>>
Xshell5中常用linux服务器命令集合
查看>>
合并区间(LintCode)
查看>>
npm升级到最新版本、指定版本
查看>>
作业-继承8
查看>>
响应式网页的布局设计
查看>>
POJ2478 Farey Sequence
查看>>
使用editcap命令将ERF格式转换为pcap格式
查看>>
Xcode 创建.a和framework静态库(转)
查看>>
解决Error response from daemon: Get https://registry-1.docker.io/v2/library/hello-world/manifests/
查看>>
POJ1386 Play on Words
查看>>
bootstrap轮播如何支持移动端滑动手势
查看>>
python爬虫 智联招聘 工作地点
查看>>
使用hql动态创建对象问题
查看>>
Hadoop基础-网络拓扑机架感知及其实现
查看>>
运维开发笔记整理-前后端分离
查看>>
【OSX】build AOSP 2.3.7时的build error解决
查看>>
那些按烂的Linux命令集合贴
查看>>