您好!欢迎来到 南京典乐信息科技有限公司 ,江苏大型门户网站建设顶尖技术团队!
行业资讯
是否创建线程要怎么看

关于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专门提供的,效率更高些!

上一案例-铜陵生活网
下一案例-半岛娱乐社区

Copyright @2011-2018 南京典乐信息科技有限公司 版权所有 全国联线:400-025-1949
南京市中华路420号江苏省高新技术创业园5层 项目经理:13851941123 QQ:260193150 点击这里给我发消息
本站关键词:南京网站建设 南京网站设计 南京随家仓网站制作 南京设计公司