winform如何在非UI线程中更新控件属性

使用 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

结合 TaskTaskScheduler,适用于异步编程模型。

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/awaitTask.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";
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值