[Winform入门教程]多线程使用学习笔记
一、基础概念
- 线程与进程
- 进程:应用程序执行的独立单位(如.exe文件)
- 线程:进程内的执行单元,最少包含1个主线程
- 多线程优势:提升响应速度、CPU利用率、实现异步操作
- 线程特性
- 共享进程内存空间
- 独立执行路径
- 通过Thread.Sleep暂停执行
二、C#多线程实现方式
1. Thread类(基础方式)
using System.Threading; // 创建线程 Thread thread = new Thread(new ThreadStart(WorkMethod)); thread.Start(); void WorkMethod() { // 线程执行内容 }
2. ThreadPool(线程池)
ThreadPool.QueueUserWorkItem(state => { // 后台执行的任务 });
3. Task(推荐方式)
using System.Threading.Tasks; Task.Run(() => { // 异步任务代码 });
4. async/await(异步编程模型)
async Task MainAsync() { await Task.Run(() => { // 后台执行代码 }); }
5. BackgroundWorker(WinForm专用)
BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += (s, e) => { /* 后台操作 */ }; worker.RunWorkerAsync();
三、线程同步技术
- lock关键字
private readonly object _lockObj = new object();
lock(_lockObj) { // 临界区代码 }
- Monitor类
Monitor.Enter(_lockObj); try { // 临界区代码 } finally { Monitor.Exit(_lockObj); }
- Mutex互斥体
using var mutex = new Mutex(false, "Global\\MyMutex"); mutex.WaitOne(); // 受保护代码 mutex.ReleaseMutex();
四、WinForm线程安全
// 跨线程更新UI this.Invoke((MethodInvoker)delegate { dataGridView1.Rows[0].Cells["状态"].Value = "已完成"; });
五、实战示例
场景:多线程处理数据+UI更新
// 线程安全队列 ConcurrentQueue<Data> queue = new ConcurrentQueue<Data>(); // 启动处理线程 for(int i=0; i<3; i++) { Task.Run(() => { while(queue.TryDequeue(out var data)) { ProcessData(data); UpdateUI(data); } }); } void UpdateUI(Data data) { if(dataGridView1.InvokeRequired) { dataGridView1.BeginInvoke(new Action(() => { dataGridView1.Rows[data.Index].Cells["状态"].Value = "已完成"; })); } }
六、注意事项
- 避免过度线程化(推荐使用线程池)
- 使用CancellationToken实现可控终止
- 线程异常必须捕获处理
- 跨线程访问控件必须通过Invoke
- 优先选择Task替代原始Thread类
七、调试技巧
- 使用Thread窗口查看活动线程
- 通过Parallel Stacks视图分析线程关系
- 设置线程名称便于调试
Thread.CurrentThread.Name = "数据处理线程";
完整项目示例和进阶内容可参考微软官方文档: [Threading in C# - Joseph Albahari](https://www.albahari.com/threading/
浙公网安备 33010602011771号