第四十一式:C# 多线程 (分身术)

绝世
秘籍
冲儿,你练剑的时候,能不能同时喝酒?能不能同时唱歌?
普通人只能一心一意,但高手可以一心多用
在代码里,同时做多件事,就叫多线程 (Multithreading)
就像周伯通的左右互搏术?左手画圆,右手画方?

1. Thread - 召唤分身

这是最原始的分身术。创建一个线程,就是召唤一个分身去干活。


using System.Threading;

void DoWork()
{
    for (int i = 0; i < 5; i++)
    {
        Console.WriteLine("分身在干活..." + i);
        Thread.Sleep(1000); // 休息1秒
    }
}

// Main:
Thread t = new Thread(DoWork);
t.Start(); // 分身出发!

Console.WriteLine("本体在喝酒..."); // 主线程继续执行,不等待分身
        

2. Task - 雇佣兵

现在更流行用 Task。它更智能,会自动利用线程池(ThreadPool)。


using System.Threading.Tasks;

Task.Run(() => 
{
    Console.WriteLine("雇佣兵在干活...");
});
        

3. async/await - 等待援军

这是 C# 的终极奥义!让异步代码写起来像同步代码一样简单。


// 定义一个异步招式
async Task DownloadSecretAsync()
{
    await Task.Delay(3000); // 模拟耗时操作(如飞鸽传书需要时间)
    return "葵花宝典";
}

// 调用它
Console.WriteLine("开始接收秘籍...");
string book = await DownloadSecretAsync(); // 在这里等待,但不阻塞主线程(你可以去干别的)
Console.WriteLine("收到:" + book);
        
多线程最怕资源争夺 (Race Condition)
如果两个分身同时去抢同一个包子(修改同一个变量),包子可能会被撕碎!
这时候需要用 lock(锁)把包子锁起来,一次只让一个人抢。
👥

动手时刻:左右互搏

使用 Task 开启两个任务。

任务一:每隔 0.5 秒输出 "左手画圆"。

任务二:每隔 0.5 秒输出 "右手画方"。

让它们同时运行 3 秒钟。

查看参考答案

Task t1 = Task.Run(async () => 
{
    for(int i=0; i<6; i++) { Console.WriteLine("左手画圆"); await Task.Delay(500); }
});

Task t2 = Task.Run(async () => 
{
    for(int i=0; i<6; i++) { Console.WriteLine("右手画方"); await Task.Delay(500); }
});

await Task.WhenAll(t1, t2); // 等待两人都画完
Console.WriteLine("收功!");
                    

成就解锁:【三头六臂】 获得:分身卷轴