异步的基础知识

Posted LoveTomato

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了异步的基础知识相关的知识,希望对你有一定的参考价值。

基本概念

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

以上是关于异步的基础知识的主要内容,如果未能解决你的问题,请参考以下文章

当片段视图加载是异步任务的一部分时,如何在片段加载之前显示进度条?

从片段中调用分离的异步任务类

Android 我应该在异步任务中将片段作为弱引用传递吗?

屏幕方向期间片段内的异步任务

我应该在 Fragment 中的啥生命周期状态下执行异步任务?

在 TabLayout 和 ViewPager2 中执行异步任务后更新具有相同布局的多个片段