[Winform入门教程]多线程使用学习笔记

一、基础概念

  1. 线程与进程
  • 进程:应用程序执行的独立单位(如.exe文件)
  • 线程:进程内的执行单元,最少包含1个主线程
  • 多线程优势:提升响应速度、CPU利用率、实现异步操作
  1. 线程特性
  • 共享进程内存空间
  • 独立执行路径
  • 通过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();

三、线程同步技术

  1. lock关键字
private readonly object _lockObj = new object();
lock(_lockObj) { // 临界区代码 }
  1. Monitor类
Monitor.Enter(_lockObj);
try {
    // 临界区代码
}
finally {
    Monitor.Exit(_lockObj);
}
  1. 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 = "已完成";
        }));
    }
}

六、注意事项

  1. 避免过度线程化(推荐使用线程池)
  2. 使用CancellationToken实现可控终止
  3. 线程异常必须捕获处理
  4. 跨线程访问控件必须通过Invoke
  5. 优先选择Task替代原始Thread类

七、调试技巧

  1. 使用Thread窗口查看活动线程
  2. 通过Parallel Stacks视图分析线程关系
  3. 设置线程名称便于调试
Thread.CurrentThread.Name = "数据处理线程";

完整项目示例和进阶内容可参考微软官方文档: [Threading in C# - Joseph Albahari](https://www.albahari.com/threading/

posted @ 2025-06-01 12:50  修道者~  阅读(95)  评论(0)    收藏  举报