C# 多线程入门教程:从零理解 Thread、Task、async/await

📅 2026/7/24 13:31:28
C# 多线程入门教程:从零理解 Thread、Task、async/await
多线程是 C# 开发中非常重要的能力。它可以让程序同时执行多个任务提高响应速度和运行效率。例如下载文件时界面不会卡死游戏中同时处理 AI、动画、网络服务器同时处理多个用户请求大数据计算利用多个 CPU 核心1. 什么是线程简单理解线程就是程序执行任务的一条“流水线”。一个程序运行时默认有一个线程程序启动 | | 主线程(Main Thread) | 执行业务代码例如static void Main(string[] args) { Console.WriteLine(开始执行); for(int i 0; i 5; i) { Console.WriteLine(i); } Console.WriteLine(执行结束); }执行开始执行 0 1 2 3 4 执行结束所有代码都在一个线程里面执行。2. 为什么需要多线程假设下载文件(); 播放音乐(); 刷新界面();如果下载需要10秒主线程 下载文件 | |------等待10秒 | 播放音乐 | 刷新界面程序会卡顿无响应用户体验差使用多线程主线程 | |----显示界面 线程2 | |----下载文件 线程3 | |----播放音乐三个任务同时运行。3. C#创建线程 ThreadC#最基础的线程类using System.Threading; class Program { static void Main() { Thread t new Thread(Test); t.Start(); Console.WriteLine(主线程结束); } static void Test() { Console.WriteLine(子线程执行); } }运行可能输出主线程结束 子线程执行或者子线程执行 主线程结束原因两个线程同时竞争 CPU。4. Thread传递参数方法一LambdaThread t new Thread(() { Console.WriteLine(执行任务); }); t.Start();方法二传递参数Thread t new Thread(obj { string name obj.ToString(); Console.WriteLine(name); }); t.Start(C#学习);输出C#学习5. Thread常用方法Start()启动线程thread.Start();Sleep()暂停线程Thread.Sleep(1000);单位毫秒 1000 1秒例static void Test() { for(int i0;i5;i) { Console.WriteLine(i); Thread.Sleep(1000); } }效果0 等待1秒 1 等待1秒 2 ...Join()等待线程完成Thread t new Thread(Test); t.Start(); t.Join(); Console.WriteLine(全部完成);执行子线程执行 全部完成6. 多线程共享数据问题看代码int count 0; Thread t1 new Thread(() { for(int i0;i10000;i) { count; } }); Thread t2 new Thread(() { for(int i0;i10000;i) { count; } }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine(count);你认为结果20000实际可能15342 18765 19921为什么因为count不是一步完成。实际上读取count 1 写回count两个线程同时修改造成线程安全问题7. lock解决线程安全object objnew object(); lock(obj) { count; }完整int count0; object lockernew object(); Thread t1new Thread((){ for(int i0;i10000;i) { lock(locker) { count; } } }); Thread t2new Thread((){ for(int i0;i10000;i) { lock(locker) { count; } } }); t1.Start(); t2.Start(); t1.Join(); t2.Join(); Console.WriteLine(count);结果200008. Task现代C#推荐方式现在企业开发很少直接使用 Thread。更多使用Task async await例如Task.Run((){ Console.WriteLine(后台任务); });等待任务Task task Task.Run((){ Thread.Sleep(3000); Console.WriteLine(完成); }); task.Wait(); Console.WriteLine(结束);9. async await异步编程例static async Task Download() { Console.WriteLine(开始下载); await Task.Delay(3000); Console.WriteLine(下载完成); } static async Task Main() { await Download(); }输出开始下载 等待3秒 下载完成10. Thread 和 Task区别对比ThreadTask年代早期现代资源占用线程线程池管理复杂简单返回结果麻烦方便推荐程度低高实际开发普通后台任务 ↓ Task 网络请求 ↓ async await CPU密集计算 ↓ Parallel