多线程

进程:正在运行的应用程序(程序运行时占用的全部计算机资源)

当我们打开一个应用程序时,进程会在内存中给其分配独立的内存空间和运行的环境

进程是操作系统分配资源的最小单位

进程分配线程来执行代码

一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线

线程是程序执行的最小单位,是轻量级进程

进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间

每个应用程序都会有一条默认的线程,主线程

进程命名空间:using System.Diagnostics;

线程命名空间:using System.Threading;

注:ThreadStart和ParameterizedThreadStart都是委托类型

前台线程和后台线程

主线程,如UI线程是前台线程

当关闭程序时,后台线程会立即关闭,但前台线程需要运行完成才会关闭

通过IsBackground设置后台线程

线程的优先级

线程池

  出于对性能的考虑,.NET引入CLR线程池这个概念。CLR线程池并不会在CLR初始化的时候立刻建立线程,而是在应用程序要创建线程来执行任务时,线程池才初始化一个线程。线程的初始化与其他的线程一样。在完成任务以后,该线程不会自行销毁,而是以挂起的状态返回到线程池。直到应用程序再次向线程池发出请求时,线程池里挂起的线程就会再度激活执行任务。这样既节省了建立线程所造成的性能损耗,也可以让多个任务反复重用同一线程,从而在应用程序生存期内节约大量开销。
        CLR线程池分为工作者线程(workerThreads)与I/O线程 (completionPortThreads) 两种,工作者线程是主要用作管理CLR内部对象的运作,I/O(Input/Output) 线程顾名思义是用于与外部系统交换信息。
注:通过CLR线程池所建立的线程总是默认为后台线程,优先级数为ThreadPriority.Normal。

ThreadPool相比Thread来说具备了很多优势,但是ThreadPool却又存在一些使用上的不方便。比如:
ThreadPool不支持线程的取消、完成、失败通知等交互性操作;
ThreadPool不支持线程执行的先后次序;

Task类

多线程和异步的区别

异步操作的本质
所有的程序最终都会由计算机硬件来执行,所以为了更好的理解异步操作的本质,我们有必要了解一下它的硬件基础。
熟悉电脑硬件的朋友肯定对DMA这个词不陌生,硬盘、光驱的技术规格中都有明确DMA的模式指标,其实网卡、声卡、显卡也是有DMA功能的。DMA就是直 接内存访问的意思,也就是说,拥有DMA功能的硬件在和内存进行数据交换的时候可以不消耗CPU资源。只要CPU在发起数据传输时发送一个指令,硬件就开始自己和内存交换数据,在传输完成之后硬件会触发一个中断来通知操作完成。这些无须消耗CPU时间的I/O操作正是异步操作的硬件基础。所以即使在DOS这样的单进程(而且无线程概念)系统中也同样可以发起异步的DMA操作。

线程的本质
线程不是一个计算机硬件的功能,而是操作系统提供的一种逻辑功能,线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度。
多线程和异步的区别

多线程和异步操作两者都可以达到避免调用线程阻塞的目的。但是,多线程和异步操作还是有一些区别的。而这些区别造成了使用多线程和异步操作的时机的区别。
    线程本质上是进程中一段并发运行的代码,所以线程需要操作系统投入CPU资源来运行和调度;
    多线程是顺序执行,编程简单。但是线程的使用(滥用)会给系统带来上下文切换的额外负担。并且线程间的共享变量可能造成死锁的出现;
    异步本质上是计算机硬件功能,其操作无须消耗CPU时间的I/O操作;
    异步无须额外的线程负担,程序主要使用回调方式进行处理,处理函数可以不必使用共享变量;
    编写异步操作的复杂程度较高,程序调用与普通人的思维方式有些出入,而且难以调试。

原文地址:https://www.cnblogs.com/1016391912pm/p/11675206.html