前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

异步的基础知识

基本概念

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

posted @ 2018-05-31 07:27  LoveTomato  阅读(294)  评论(0编辑  收藏  举报