WinForm WPF 在非UI线程操作控件
由于线程安全机制,WinForm和WPF都是只能在UI线程中操作UI控件,否则抛出在非创建该控件的线程中访问控件。
但是常常需要在子线程中刷新控件的显示,可采用下面的方法
将一段对控件刷新的逻辑的逻辑包装在委托中,然后使用 SynchronizationContext 将委托传递给UI线程的执行队列,交给UI线程执行刷新逻辑。
public partial class Form1 : Form
{
// 线程同步上下文
SynchronizationContext _synchronizationContext;
public Form1()
{
InitializeComponent();
_synchronizationContext = SynchronizationContext.Current;
}
private void button1_Click(object sender, EventArgs e)
{
new Thread(Test).Start();
}
void Test()
{
// 因为Winform和WPF中只有UI线程才能操作控件,所以需要将非UI线程中操作控件的代码发送到UI线程
// 在Winform中处理办法
this.Invoke(new Action(()=> this.textBox1.Text="123456"));
// 在WPF中处理办法
Dispatcher.Invoke(() => this.textBlock.Text = "123456");
// 两则都适用办法
_synchronizationContext.Post(obj => this.textBox1.Text = (string)obj , "123456");
}
}

浙公网安备 33010602011771号