技术开发 频道

.NET异步编程:IO完成端口与BeginRead

  总结

  本文先介绍了一下IO完成端口的原理,然后打开FileStream的源代码,看看.NET是如何利用IO完成端口进行异步IO请求的。IO完成端口是一种非常高效的编程方式,所以如果我们想构建界面响应灵敏或高可伸缩性的服务应用,如果你的应用又是IO密集型的,那么你应该仔细的设计你的应用,利用异步IO的优势。

  但是我们切忌拿着锤子就是钉子,发现IO完成端口这把利器就到处使用,甚至都不去思考是否值得。从前面几篇文章以及本文的分析来看,如果我们使用同步的方式那么一切都是在同一个方法内部完成,分配的一些对象的引用也都是在栈上完成,所以本方法退出后这些分配的资源都可以高效的回收。但是如果使用异步IO的话我们无法在一个方法内完成,所以很多东西的生命周期无形的延长了,本方法退出后还是不能销毁;这是其一,其二是要利用IO完成端口就必须进行额外的平台调用(从.NET调入到CLR甚至到Windows内核),这些调用都是非常昂贵的。所以如果我们在构建服务器应用时,如果应用的规模并不是非常大,我们还是应该首选同步的方式,这样编程更容易,消耗的资源也更少。当然,这都是基于你实际的应用经过不断的尝试和调整得出的。

  我希望本文能对某些同学心中怀疑BeginRead到底占不占用线程,IO线程又是个什么东西起到释疑的作用。

1