博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
多线程原来是这么简单
阅读量:4560 次
发布时间:2019-06-08

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

 

通过对比单线程和多线程,创建了一个winform小程序来对比,界面如下:

首先建立一个循环999999999次的方法:

void CountTime(){DateTime beginTime = DateTime.Now;for (int i = 0; i <= 999999999; i++){}TimeSpan ts = DateTime.Now.Subtract(beginTime);MessageBox.Show("执行完毕!!"+ts.TotalMilliseconds);}

回到界面单击“单线程的缺点”这个按钮,编写事件代码如下:

//单线程的缺点

private void btnSingleThread_Click(object sender, EventArgs e){CountTime();}
点击运行,由于不能演示看,你会看到你无法拖动这个窗口移动摇晃,好像界面卡死了一样,过了一会儿,因为循环计数结束,弹出

如下窗口:

2)那么如何解决这种UI卡死的问题呢,因为之前单单用到单线程的而出现卡死的问题是因为界面运行的时候,其实主线程只能去处理计数,而根本没有时间去处理你偶外的“拖动摇晃”这个事件,之道计数这个事情做完之后才会过来做“拖动摇晃”的这个事件,为了解决这个“假死”的事情,就要用到多线程技术,点击界面的“多线程”按钮,如下代码:

//使用多线程来解决UI卡死问题

private void btnMulTread_Click(object sender, EventArgs e){//ThreadStart ts = new ThreadStart(CountTime);//Thread th = new Thread(ts);//创建线程对象 传入要线程执行的方法Thread th = new Thread(CountTime);//将线程设置为后台线程(当所有的前台线程结束后,后台线程会自动退出)th.IsBackground = true;//启动线程执行方法th.Start();}

这样点击运行并点击“多线程”按钮来执行的话,你会发现运行过程中你可以拖动窗口,非常流畅地拖动着走,直到运行结束弹出如下消息窗口:

细心的你可能会发现上面两个执行时间不一样,单线程用的时间比多线程用的少那么一点点,原因是因为CPU要来回转过去执行UI线程和计数线程,其实多线程的实际上不是同时执行,只是因为CPU处理速度太快了,可以非常快速地来回在各个线程之间切换执行,就好像我们先烧开水,然后不用去等开水开了就可以去洗衣服一样,因为CPU处理的速度太快了,我们人裸眼根本察觉不到它在各个线程之间不停地切换,感觉好像是同时运行一样。

转载于:https://www.cnblogs.com/EdwinX/archive/2012/08/07/2626966.html

你可能感兴趣的文章
《机器学习实战》学习笔记第四章 —— 朴素贝叶斯法
查看>>
承接上篇scanf函数何时取&问题
查看>>
python笔记 - day4-之装饰器
查看>>
HttpWebResponse远程服务器返回错误: (500) 内部服务器错误
查看>>
关于.net MVC5+EF6 网站部署的问题
查看>>
异常 : identifier of an instance of com.mi.domain.Department was altered from 2 to 1
查看>>
实现托管代码调用非托管代码以及非托管代码调用托管代码->COM Interop
查看>>
简易乘方算法
查看>>
leetcode - Unique Paths
查看>>
舵机控制
查看>>
句柄类与继承
查看>>
cocos2d-x-3.1 事件分发机制 (coco2d-x 学习笔记七)
查看>>
多项式问题
查看>>
服务器实现的多种方法汇总
查看>>
理解jquery的$.extend()、$.fn和$.fn.extend()
查看>>
在线安装eclipse中html/jsp/xml editor插件 eclipseeditor
查看>>
MAC下彻底解决mysql无法插入和显示中文
查看>>
HDU 4456 Crowd
查看>>
Union和union all区别?
查看>>
map_multimap
查看>>