1. 线程的概念
- 线程是轻量级进程。
- 进程包含线程,进程的资源被线程共享,线程不拥有资源。通过
Thread
类新建线程默认为前台线程。 - 一个进程可以有多个线程,并且多个线程可以同时运行应用程序中的代码。在这种情况下,每个线程将执行不同的任务,或者可以说每个线程将执行应用程序代码的不同部分。
1.1 线程生命周期
- 未启动:线程实例被创建但
Start
方法未被调用时 - 就绪:线程准备好运行并等待CPU周期时的状况
- 不可运行:已调用
Sleep
方法/已经调用Wait
方法/通过I/O
操作阻塞 - 死亡:线程已完成执行或已终止
1.2 主线程
- 进程中第一个被执行的线程称为主线程。
- 当C#程序开始启动时,主线程自动创建。
using System.Threading;
Thread th = Thread.CurrentThread; //获取主线程
1.3 使用Thread类
Thread类,最基本的创建线程的方法。
using System;
using System.Threading;
class Program{
static void Main(){
Thread thread = new Thread(MyThread);
thread.Start();
}
static void MyThread(){
Console.WriteLine("This is a new Thread");
}
}
Task类:.Net FrameWork中提供的一种高级的多线程编程方式,用于执行异步操作。
Task task = Task.Run(()=>(
Console.WriteLine("This is a Task.");
));
task.Wait(); //等待任务完成
异步方法(async/await):更现代、更简洁的处理异步操作的方式。
using System;
using System.Threading.Tasks;
class Program{
static async Task Main(){
await MyAsyncMethod(); //在需要等待的操作前使用`await`关键字
}
static async Task MyAsyncMethod(){
await Task.Delay(1000);
Console.WriteLine("This is an async method.");
}
}
2. 线程同步
- 线程同步:在某一时刻只有一个线程可以访问变量。
- 使用C#语言关键字
Lock
,把一段代码定义为互斥段。 - 锁(Lock)允许多个线程在同一时间内只有一个能访问被锁定的资源,从而避免数据不一致等问题。
lock(obj){
//do something...
}
obj 是一个对象,它用于表达一个互斥锁。当一个线程进入被lock
保护的代码块时,其他试图访问lock
的线程将会被阻塞,直到当前线程退出该代码块。
obj 为希望锁定互斥访问的对象,要求如下:
- obj不能为空值,因为
Null
是不需要被释放 - 不能为
stirng
类型 - 不能为值类型,每次装箱后的对象不一样,锁定会报错
- 避免
public
类型,如果该实例可以被公开访问,则lock可能会出问题,因为不受控制的代码也能锁定该对象 - 推荐使用
private static readonly
对象
3. reference
[1] https://www.runoob.com/csharp/csharp-multithreading.html
[2] https://www.cnblogs.com/wyy1234/p/9166444.html
[3] https://cloud.tencent.com/developer/article/2318142