异步的基础知识

基本概念

进程:Windows系统采用抢先式多任务,每个运行的程序都分配在一个独立的进程中Process,进程就是描述运行程序所需要的资源信息(如内存或堆栈的使用情况)。
线程:线程位于进程下,用于描述程序执行状态的一种结构(所以线程可以在CPU上切换运行)。
多线程开发:通常一个进程中默认有一个主线程,但是如果一个操作延时就无法进行其它操作。多线程可是两个线程交替在CPU上处理,还有根据线程的用途可分为:IO线程和计算线程,IO线程:仅仅在任务开始和结束时需要CPU;计算线程使用CPU密度较高。所以开发中主要考虑将IO线程闲置的CPU交由其他线程提供CPU利用率。

.Net中的线程

.Net中通过System.Threading命名空间下的类托管线程,线程是种昂贵的资源引入线程池管理。线程表示代码的执行,主要以委托Delegate类型参数供线程运行,系统提供的委托有:
| 名称 | 作用 |
| --- | --- |
| ThreadStart | 没有参数的线程入口方法 |
| ParameterizedThreadStart | 带参数的线程入口方法 |
| TimeerCallback | 定时执行带参数的线程入口方法(有线程池管理线程) |

异步模式

APM异步模式

对于IO线程,通过BeginXXX和EedXXX一对方法执行

  1. 启动线程后,主线程结束
  2. 第二步不需要CPU参与
  3. 开启线程执行第三部

    EPM基于事件的多线程

    后缀为AsyncCompleted的方法,WinForm 提供的控件管理

    Task 异步

    前面两种异步是.Net较早的版本,缺点:异步模式难以理解(将程序逻辑切割乱);第三部不能回到主线程,不能访问线程中数据。基于任务的解决了以上问题,在结合asyncawait关键字,使异步编程更简单

        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用的线程先返回到线程池供新的请求使用,异步结束在调取线程响应。

猜你喜欢

转载自www.cnblogs.com/LoveTomato/p/9114682.html