网络宝典
第二套高阶模板 · 更大气的阅读体验

C#多线程编程入门:让你的程序跑得更快

发布时间:2025-12-16 16:09:45 阅读:104 次

什么是多线程

想象一下你在煮方便面,一边烧水,一边拆调料包、切火腿。如果一件事接一件事做,就得等水开了再准备配料,浪费时间。电脑也一样,有些任务可以“同时”进行,这就是多线程的用武之地。

C#中的多线程基础

C# 提供了 System.Threading 命名空间,让我们可以轻松创建和管理线程。最简单的例子是使用 Thread 类启动一个新线程:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread thread = new Thread(DoWork);
        thread.Start();

        Console.WriteLine("主线程继续执行...");
        Console.ReadKey();
    }

    static void DoWork()
    {
        for (int i = 0; i < 5; i++)
        {
            Console.WriteLine($"工作线程输出:{i}");
            Thread.Sleep(1000); // 模拟耗时操作
        }
    }
}

运行后你会发现,“主线程继续执行”会立刻打印,而 DoWork 方法在后台慢慢输出数字。两个任务像是在“并行”干活。

别让线程打架

多个线程一起跑,容易抢资源。比如两个线程同时往一个文件写数据,内容可能就乱了。这时候要用 lock 关键字来“上锁”:

private static object lockObj = new object();

static void WriteLog(string message)
{
    lock (lockObj)
    {
        File.AppendAllText("log.txt", message + "\n");
    }
}

这样一来,只有一个线程能进入 lock 块,写完才能轮到下一个,避免数据冲突。

更现代的方式:Task 和 async/await

Thread 虽然直接,但用多了难管理。C# 后来引入了 Task,更简洁也更适合复杂场景。比如:

static async Task Main(string[] args)
{
    Console.WriteLine("开始任务...");

    Task task1 = Task.Run(() => DoWork());
    Task task2 = Task.Run(() => DoWork());

    await Task.WhenAll(task1, task2);

    Console.WriteLine("所有任务完成!");
}

这段代码同时启动两个任务,主程序等它们都做完才继续。async 和 await 让异步代码看起来像同步一样清晰,不容易绕晕。

实际应用场景

你在写一个下载工具,用户点“批量下载”时,如果一个接一个下,体验很差。用多线程,每个文件开一个任务,进度条各自更新,界面还不卡顿,用户体验立马提升。

再比如图像处理软件,打开大图时可以用后台线程加载,前台还能响应按钮点击,不会“假死”。

小心资源消耗

线程不是越多越好。每个线程都要内存和系统调度,开几百个反而拖慢程序。一般建议用线程池(ThreadPool)或 Task,它们会自动管理线程数量,避免资源浪费。