线程的使用
- 代码笔记
- 7小时前
- 9热度
- 0评论
方式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("完成");
});
}
