一. 目标
- 进程和线程基本概念
- 为什么需要多线程?
- C#实现多线程的方式?
- 线程Thread的创建,终止,挂起和恢复?
二. 技能介绍
① 进程和线程
- 什么是进程(Process)
- 一个正在运行的程序实例就是一个进程,拥有独立的内存空间和资源.
- 每个进程都在自己的内存空间内运行,相互之间不直接共享内存,进程间通信一般需要一些机制,比如进程间通信IPC.
- 每一个进程都有自己的一个主线程,而这个主线程是程序的入口点,它可以创建其他线程来执行不同的任务
- 什么是线程(Thread)
- 线程是进程内的一个执行单元,也是操作系统可执行的最小单元.
- 一个进程中的多个线程共享进程的资源,它们之间可以共享数据.
- 线程在程序中是可以并行执行的.
- 多进程
多进程指的是多个独立运行的进程,每个进程都有自己的内存控件,独立执行任务,相互之间不会收到影响.
多进程可以提高系统的并行性和稳定性,但是进程间的通信开销比较大
- 多线程
多线程是指在同一个进程内同时执行多个线程.线程之间可以更方便地共享数据和通信,适用于需要高度协作和共享资源的任务.多线程可以提高程序的响应速度和资源利用率
② 为什么需要多线程
在软件开发中,我们可能会遇到下面这些需求:
- 1. 图像用户界面GUI应用程序
主线程
UI线程
需要保持响应性,所以在执行耗时操作的的时候,要创建新的线程去操作,如果用主线程去执行耗时任务,界面将会出现卡顿,就影响了用户使用体验.
- 2. 网络编程
在网络编程中,常常需要同时处理多个网络请求或者连接.使用多线程可以让程序更高效处理这些请求,避免阻塞主线程
- 3. 并行计算
对于需要大量计算的任务,如数据处理,图像处理等,通过使用多线程可以充分利用多核处理器,加快任务完成速度
总结
- 提高效率
- 提高响应速度
- 充分利用多喝处理器
③ C#实现多线程的方式
- 使用Thread类
语法
Thread thread = new Thread(()={
});
例子
#region 1. 使用Thread创建线程
Thread thread = new Thread(() =>
{
Console.WriteLine("我是线程1,我采用的是Thread(lambda=>{}) 匿名表达式的方式");
});
thread.Start();
// thread线程启动之后,会继续往下执行,不会阻塞线程
#endregion
- 使用Task类
语法
Task task = Task.Run(()=> {
})
例子
Task task = Task.Run(() =>
{
Console.WriteLine("我是线程2,我采用的是Task(lambda=>{}) 匿名表达式的方式");
});
// Task.Wait()方法用于等待任务的完成,在调用该方法之后,当前现场会被阻塞,直到任务执行完成为止
task.Wait();
- 使用ThreadPool类
语法
ThreadPool.QueueUserWorkItem((state)=>{
})
例子
ThreadPool.QueueUserWorkItem((state) =>
{
Console.WriteLine("我是线程3,我采用的是ThreadPool方式");
});
// 这种方式创建的线程是线程池创建线程,是不会阻塞主线程的,主线程会继续往下执行.
- 使用Async/Await异步编程
例子
#region 4. 使用Async/Await
await Task.Run(() =>
{
Console.WriteLine("我是线程4,我采用的额Async/Await的方式");
});
#endregion
- 使用Parallel.For方法
用于并行执行一个for循环,可以在多个线程中同时处理循环中的元素,可以在单独的线程上执行for循环中的数据和后面的计算表达式
例子:
Parallel.For(0, 10, i =>
{
Console.WriteLine($"当前数据i = {
i},线程Id = {
Thread.CurrentThread.ManagedThreadId}");
Thread.Sleep(1000);
});