线程的使用

方式1:使用 Invoke(传统方法)

private void btnStart_Click(object sender, EventArgs e)
{
    // UI线程
    
    Task.Run(() => 
    {
        // 非UI线程
        Thread.Sleep(1000);
        
        // ✅ 通过 Invoke 回到 UI 线程
        this.Invoke(new Action(() => 
        {
            label1.Text = "完成";  // 现在在 UI 线程
            progressBar.Value = 100;
        }));
    });
}

方式2:使用 async/await(推荐)

private async void btnStart_Click(object sender, EventArgs e)
{
    // UI线程
    
    await Task.Run(() => 
    {
        // 非UI线程
        Thread.Sleep(1000);
        // 注意:这里仍然不能操作UI控件
    });
    
    // ✅ 回到 UI 线程(await 自动切换回来)
    label1.Text = "完成";  // 安全!
    progressBar.Value = 100;
}

方式3:使用 Progress(进度报告)

private void btnStart_Click(object sender, EventArgs e)
{
    // UI线程
    
    var progress = new Progress<string>(msg => 
    {
        // ✅ UI线程执行
        label1.Text = msg;
    });
    
    Task.Run(() => 
    {
        // 非UI线程
        Thread.Sleep(1000);
        
        // ✅ 通过 Progress 报告进度(自动封送到 UI 线程)
        progress.Report("完成");
    });
}