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");
        }
    }

posted @ 2021-10-14 19:43  追风少年2021  阅读(155)  评论(0)    收藏  举报