C# 跨线程访问UI线程控件
在C#中,由于使用线程和调用UI的线程属于两个不同的线程,如果在线程中直接设置UI元素的属性,此时就会出现跨线程错误。
下面介绍两种解决方案
第一种:使用控件自带的Invoke或者BeginInvoke方法。
Task.Factory.StartNew(() => { this.button1.Invoke(new Action(() => { this.button1.Text = "hello world"; })); });
第二种:使用线程的同步上下文 SynchronizationContext
private SynchronizationContext _syncContext = SynchronizationContext.Current; private void button1_Click(object sender, EventArgs e) { Task.Factory.StartNew(() => { _syncContext.Post(p => { this.button1.Text = "hello world"; }, null); }); }
以上两种方式,均可实现跨线程访问UI线程控件,且用且珍惜;