C# 多线程

本文介绍了C#中的线程概念,包括线程的定义、生命周期阶段、主线程的创建以及如何使用Thread类和Task类进行线程管理。还讨论了异步编程和线程同步的重要性,特别是使用Lock关键字实现互斥访问以防止数据一致性问题。
摘要由CSDN通过智能技术生成

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 为希望锁定互斥访问的对象,要求如下:

  1. obj不能为空值,因为Null是不需要被释放
  2. 不能为stirng类型
  3. 不能为值类型,每次装箱后的对象不一样,锁定会报错
  4. 避免public类型,如果该实例可以被公开访问,则lock可能会出问题,因为不受控制的代码也能锁定该对象
  5. 推荐使用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

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值