欢迎光临南京典乐信息科技有限公司
24小时:400-025-1949
繁體版
手机版
公司新闻
行业新闻
当前位置:首页 » 新闻中心 » 公司新闻

IO操作不要将其放到另外一个线程上

发表日期:2017-12-25 17:45:01文章编辑:浏览次数:151 标签:公司新闻    

对于IO密集型的应用(比如数据库访问,磁盘访问,网络访问)来讲,是不需要分配一个线程的(不怎么准确,但可以这么理解),那么使用一个后台线程运行这些操作来实现异步是低效的。而实际上我们的应用中充斥着大量的IO密集型操作(除了那些做游戏应用计算密集型)。经过测试,actualRead的长度可能会比BUF ...

对于IO密集型的应用(比如数据库访问,磁盘访问,网络访问)来讲,是不需要分配一个线程的(不怎么准确,但可以这么理解),那么使用一个后台线程运行这些操作来实现异步是低效的。而实际上我们的应用中充斥着大量的IO密集型操作(除了那些做游戏应用计算密集型)。经过测试,actualRead的长度可能会比BUFFER_LENGTH 小,但这并不代表网络传输已经结束,比如我采用异步方式下载网页的时候,我定义了1024Buffer字节数组,但每次异步获取的字节长度都不足1024字节,在这种情况下不能关闭网络流的。线程间操作无效: 从不是创建控件“txtContent”的线程访问它。一般我们可以将我们的应用分为计算密集型,比如进行图像处理,解方程等,另一种就是IO密集型,比如访问数据库,访问磁盘等。
分清楚这两种了后我们再往下看。
计算密集型的代码是大量占用CPU时间,所以你用ThreadPool.QueueUserWorkItem也好,用BeginInvoke也好,都是分配一个线程来运算,无所谓(ThreadPool更佳)
IO密集型计算,我们大部分时间是在等待IO操作的,CPU并没有花多少时间来运算。所以我们不需要分配一个线程来单独进行IO,我们只需要使用异步发起IO操作,然后CPU自己干自己的事儿,当IO完成后,会回调。这样的效率就会更高。
BeginInvoke不会创建线程,你从哪里看到的?
BeginInvoke
是将操作放到另外一个线程上执行。这个线程来自线程池。

我的意思是说,对于IO操作不要将其放到另外一个线程上,这是浪费。

关于BeginInvoke是否创建线程要怎么看。
BeginInvoke调用时,CLR会将任务放到线程池的线程上执行,不是调用方法的线程了。

你可以在BeginInvoke的方法中设置一个断点,然后打开VS的线程窗口,你就可以发现该线程不是发起操作的线程。

另外,你从MSDN里引用的那个对BeginInvoke的解释是对委托的BeginInvoke的解释:
Action download = () => Download();
download.BeginInvoke();
它会使用线程池上的一个线程执行
这个是跟IO操作的BeginXXX不一样的。这是由操作系统实现的。
我们打个比方,我们去数据库查询一堆数据,那么你发起这个请求后,查询请求发送到数据库服务器,这个时候你自己的机器是不需要关心查询的执行是不?那我们只要数据库查询完毕,然后结果返回时有个机制告诉我们查询完了,你来处理吧。这就是IO异步。这样我们在查询数据库期间我们的线程不会阻塞(等结果),那么这个线程就可以去干其他事儿了,这样就能创建更少的线程,干更多的事儿。更少的线程线程上下文切换的几率就更小,消耗的资源也更少。

使用异步IO就是,我们发起一个异步IO请求,然后我们的线程就立马返回了,当请求有了结果,操作系统再从线程池里弄一线程处理后续流程。对于FileStream.BeginRead()会不会创建新的线程还是不确定,但是经过查找资料后得知,Net ThreadPool类中的线程分为Worker ThreadI/O Thread。而Worker Thread可以看成.Net通过Thread类预先创建的一组线程。.NetThreadPool类中提供的方法,如QueueUserWorkItem, Timer, delegate回调等使用的都是Worker Thread。而.Net中对I/O操作的封装,如FileStream, NetworkStream等则是使用的IO ThreadIO Thread是对I/O专门提供的,效率更高些!

专业服务:南京建站,南京网站制作,南京网站设计,南京网站制作公司

咨询电话:400-025-1949(7*24小时在线服务)

咨询QQ:260193150

公司网址:www.icanpk.com

本文地址:http://www.025app.com/news/detail_209.html

相关新闻

两Q友非法入侵他人网站推广赌博公司 南京医药官网等中招

两人利用木马信息侵入南京医药、世纪华联等单位官网串改链接帮助…

日期:2020-04-28 浏览次数:298

3月8日后南京长江二桥车道封闭维护 为期22天

为保障路桥结构和交通通行安全,经市政府批准,南京长江第二大桥…

日期:2020-03-08 浏览次数:281

怎样解决企业网站没有客户咨询的问题?

我们都知道如今是互联网的时代,传统的线下业务已经满足不了企业…

日期:2020-03-06 浏览次数:235

房地产税还有2年到达战场,3千多南京人涌向了河西...

关注两会3月4日的人大新闻发布会上,针对房地产税,发言人张业…

日期:2020-03-06 浏览次数:133

南京仙林汽配城内一物流公司卷款跑路

3月5日,有市民反映,南京仙林汽配城内的一家物流公司突然跑路…

日期:2020-03-06 浏览次数:106

关于我们
技术支持
联系我们
南京典乐科技
客服电话:400-025-1949 (工作日9:00~18:00)
项目经理:138-519-41123
咨询 Q Q:260193150
公司地址:南京中华路420号江苏省科技中心5层
客服QQ
获取报价
联系电话
400-025-1949
返回顶部