异步的基础知识
基本概念
进程:Windows系统采用抢先式多任务,每个运行的程序都分配在一个独立的进程中Process
,进程就是描述运行程序所需要的资源信息(如内存或堆栈的使用情况)。
线程:线程位于进程下,用于描述程序执行状态的一种结构(所以线程可以在CPU上切换运行)。
多线程开发:通常一个进程中默认有一个主线程,但是如果一个操作延时就无法进行其它操作。多线程可是两个线程交替在CPU上处理,还有根据线程的用途可分为:IO线程和计算线程,IO线程:仅仅在任务开始和结束时需要CPU;计算线程使用CPU密度较高。所以开发中主要考虑将IO线程闲置的CPU交由其他线程提供CPU利用率。
.Net中的线程
.Net中通过System.Threading
命名空间下的类托管线程,线程是种昂贵的资源引入线程池管理。线程表示代码的执行,主要以委托Delegate
类型参数供线程运行,系统提供的委托有:
名称 | 作用 |
---|---|
ThreadStart | 没有参数的线程入口方法 |
ParameterizedThreadStart | 带参数的线程入口方法 |
TimeerCallback | 定时执行带参数的线程入口方法(有线程池管理线程) |
异步模式
APM异步模式
对于IO线程,通过BeginXXX和EedXXX一对方法执行
- 启动线程后,主线程结束
- 第二步不需要CPU参与
- 开启线程执行第三部
EPM基于事件的多线程
后缀为Async
和Completed
的方法,WinForm 提供的控件管理
Task 异步
前面两种异步是.Net较早的版本,缺点:异步模式难以理解(将程序逻辑切割乱);第三部不能回到主线程,不能访问线程中数据。基于任务的解决了以上问题,在结合async
和await
关键字,使异步编程更简单
public async Task SteramRead(string filename)
{
using (var file = new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
{
byte[] buff = new byte[file.Length];
await file.ReadAsync(buff, 0, (int)file.Length);
}
}
方法执行到await
将上面当前线程结束,开启新的线程执行文件读取,当读取完返回执行方法的位置(且线程为第一步线程)
asp.net 中的异步
asp.net服务每接到一个请求,HttpRuntime将从HttpApplication线程池中获取一个对象。
异步的需求:但是线程池中的线程是由一定数量的,当大量用户访问是会造成线程池中没有空余线程处理用户请求。
一般解决: 在Ihandler中对于网络请求、数据库查询、文件操作开启异步,则线程会将HttpApplication
用的线程先返回到线程池供新的请求使用,异步结束在调取线程响应。