这个概念还是有点模糊,书上说对于密集的I/O操作 异步的效率比同步要高很多,比如下载网页,使用异步操作好在哪里呢?
异步的httpwebrequest不是仍然需要等待吗?"一个常见的做法就是执行一系列的I/O密集操作,同时对其结果进行操作" 这是
《Effective C#》里的一句话,我就是不是很明白,结果还在异步执行呢,怎就就对其结果进行操作了?

解决方案 »

  1.   

    这个说来可就话长了,异步IO至少可以节省很多线程资源,比如你用100个并发下载网页,同步+阻塞的话,虽然不占什么CPU资源,但是每一个并发至少要占用1个线程,一般.Net程序默认线程栈大小为1M,asp.net的话是256k,你可以算一下这部分的开销大小。至于为什么效率高,你翻一翻IOCP方面的资料,会讲的比较详细,效率提高主要是针对于那些支持DMA的以及硬盘这种,可以通过优化寻道顺序提高效率的设备。
      

  2.   

    什么乱七八糟的。唉,并发是为了什么?为了把CPU利用率提高。比如下载时你的CPU可能有那么几秒钟只有2%,如果你有一大批文件需要下载,那么就是多个连续的2%,因为它们是顺序执行的。而并发时你就能能把CPU利用率提高到40%,虽然单个下载慢了,但是整个速度快了,因为它们是并发执行的。
      

  3.   

    再说一下为什么CPU利用率很低?因为大量时间都花在等待底层各种设备的响应上了!这就是需要异步编程的原因。特别是现在的CPU多核心的越来越多,速度已经达到极限的情况下就是通过提高并发率来提高整个系统执行速度。异步编程会成为以后一个非常基本的编程知识,否则你的程序可能根本禁不起随便的code review就淘汰了。
      

  4.   

     Linux® 中最常用的输入/输出(I/O)模型是同步 I/O。在这个模型中,当请求发出之后,应用程序就会阻塞,直到请求满足为止。这是很好的一种解决方案,因为调用应用程序在等待 I/O 请求完成时不需要使用任何中央处理单元(CPU)。但是在某些情况中,I/O 请求可能需要与其他进程产生交叠
      

  5.   

    我的例子实际上是并发与串行的例子,但解决的问题是一样的,10个人周而复始的担水,诸位可以实际试试哪种快,其关键点余异步模式相同的是“减少CPU空闲的时间”,1-个人都从球场一端走回到另一端,期间就造成了10个人都是空闲的,而传递的方式时,每人异步的操作,空闲时间只有其1/10
      

  6.   

    顶LS的几位,异步线程是相对应用程序主线程(通常是UI线程)来说的,回调函数(委托)会在异步线程完成下载时主动给主线程发送一个消息,而不是让主线程一直阻塞,等待下载完成后再继续往下执行,有效地避免应用程序假死,并提高了效率(并发执行了多件事件)