使用 Control.Invoke 方法
通过 Control.Invoke 方法可以将代码委托到 UI 线程执行。适用于需要同步更新多个控件的情况。
this.Invoke((MethodInvoker)delegate {
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
});
使用 Control.BeginInvoke 方法
Control.BeginInvoke 是异步方式,适用于不需要等待更新完成的场景。
this.BeginInvoke((MethodInvoker)delegate {
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
});
使用 SynchronizationContext
SynchronizationContext 提供更通用的跨线程同步方案,适合复杂场景。
SynchronizationContext uiContext = SynchronizationContext.Current;
uiContext.Post(_ => {
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
}, null);
使用 TaskScheduler.FromCurrentSynchronizationContext
结合 Task 和 TaskScheduler,适用于异步编程模型。
Task.Factory.StartNew(() => {
// 后台工作
}, CancellationToken.None, TaskCreationOptions.None, TaskScheduler.FromCurrentSynchronizationContext())
.ContinueWith(t => {
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
}, TaskScheduler.FromCurrentSynchronizationContext());
使用扩展方法封装
可以封装一个扩展方法,简化调用过程。
public static void SafeUpdate(this Control control, Action action)
{
if (control.InvokeRequired)
{
control.Invoke(action);
}
else
{
action();
}
}
// 调用示例
this.SafeUpdate(() => {
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
});
使用 async/await 模式
结合 async/await 和 Task.Run,适用于现代异步编程。
private async void Button_Click(object sender, EventArgs e)
{
await Task.Run(() => {
// 模拟后台工作
Thread.Sleep(1000);
});
textBox1.Text = "1";
textBox2.Text = "2";
textBox3.Text = "3";
}
785

被折叠的 条评论
为什么被折叠?



