最近在研究异步编程,可是还没有搞明白这个异步编程和自己创建一个线程来执行一个方法有什么区别。
像 FileStream 类的 BeginRead 方法内部应该也是创建了一个线程去执行读取的操作,这个与我自己创建一个线程去调用 Read 方法有什么区别呢?
还有 ASP.NET 的页面异步执行,异步执行是页面执行切换到另一个页面,而处理请求的线程回到池中,这样有什么意义? 如果怕线程池中线程数不够,加大线程池中的线程数不就OK了吗?
线程是实现异步的一种方式,我这里有一篇概念性的文章可以参考http://www.cnblogs.com/Thriving-Country/archive/2010/12/24/1916137.html
FileStream 类的 BeginRead这种根本就不是什么新创建一个线程,这种就是CPU和IO之间的并行,可以理解成当前线程发了一个IO请求给操作系统的IO管理器,之后当前线程执行后续的代码,当这种IO操作完成时操作系统会使用APC机制向当前线程的APC队列中投递一个APC对象,APC的调度优先级要比较高 所以当前线程就会执行APC(这里的APC可以理解成回调的函数)。
ASP.NET的异步只是不想hang住工作线程,这样节省了线程去处理更多的用户请求。线程池的线程是线程池自己管理的,到底有多少是动态调整的,线程太多会带来上下文切换的开销,性能反而会降低。
这个话题要详细说起来很多,我这里只是随便说说,很久没上博问了,希望对你有帮助,如果要详细了解可以去我的博客里与我讨论或发邮件给我,我愿意帮助你理解异步
异步有非常多种方式, 线程只是一种方式
首先线程和线程池的应用场景比较不一样, 一般只有较长时间的任务才用线程(创建线程的代价非常高)
另外异步I/O 和普通的线程异步的处理不一样,
楼上那位朋友说的hang住线程是一个重要的原因, 线程被hang住就什么都做不了 ,还浪费资源
一般来说就尽可能让所有的线程都在工作
Asp.net里面的页面执行异步其实用处不大,总归是要等到执行完了才能response的
异步编程,我用的比较多的是winform上,顶多是执行一些ASP.NET的后台操作,如采集时候用到异步。
FileStream 类的 BeginRead说的明白一点就是相当于backgroundworker那样,就是为了方便你而已。
就好象好多控件的begininvoke,你自己实现也是可以的。