WPF 调用线程无法访问此对象,因为另一个线程拥有该对象 解决方法

WPF中窗口及窗口上的控件是属于UI线程,可以再后台代码区直接使用控件属性,却不可以不可以再新建一个线程中操作控件,因为控件属于UI线程,你新建一个线程去调用UI线程中的控件属于跨线程访问,WPF默认不能跨线程访问。下面讲解决方法,用到Dispatcher语句

            //假设我想通过线程点击一下按钮改变TextBox属性
  private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            //创建并启动线程
            ThreadStart ts = new ThreadStart(Method);
            Thread td = new Thread(ts);
            td.Start();
            
        }
            //定义一个方法
public static void Method()
        {
           //使用Dispatcher语句实现跨线程访问
             this.Dispatcher.BeginInvoke((Action)delegate()
            {
                 //括号里些想要使用的控件属性
                 this.textBox.Text = "Hello";
            });
        }

这样就可以了,这时又遇到一个问题,这样写太麻烦,不能用一次控件就写一个Dispatcher语句吧,还可以这样写

 private void btnSend_Click(object sender, RoutedEventArgs e)
        {
            //Action是没有返回值的泛型委托
            Action action = new Action(Method);
            //线程创建启用与Dispatcher语句可以连着写 
            Thread thread = new Thread((ThreadStart)delegate ()
            {
                Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, action);
            });
            thread.Start();
            //通过封装整个方法,把使用控件的语句都写在方法内,只用使用一次Dispatcher语句就可以了
        }
        //方法中不需要再Dispatcher了
        private void Method()
        {
            this.txt.Text = "Hello";
        }

 

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值