用了invoke还是出错的解决方法.wpf 调用线程无法访问此对象,因为另一个线程拥有该对象。

在WPF中,次线程无法直接更新主线程UI元素,为解决这一问题,通常采用Dispatcher.Invoke方法,将操作委托给主线程执行,确保界面更新的安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用线程无法访问此对象,因为另一个线程拥有该对象。一般来说可以这么做
在C#2005后不再支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),但是可以可以使用delegate来解决。

次线程不能直接修改主线程UI的界面,需要使用以下方法

方法1:

[c-sharp]  view plain copy
  1. this.Dispatcher.Invoke(DispatcherPriority.Normal,  
  2.    new Action(() =>  
  3.    {  
  4.       //调用主线程UI的的代码                              
  5.    }));  

还有一种是用delegte 的
btn.Dispatcher.Invoke(new Action(delegate { button1.Content = "some text"; }));
都可以, 

但是我的问题是,一直都还是出错, 后来我才发现我的代码如下(只看高亮就好了)
            try
                {
                     _msgs  . AddRange  (  tmpMsg  );
                     _latestSn  =  tmpMsg  . Max  (one => one. SN  );
                     Run txt ;

                     for  ( int  i  = 0  i  <  tmpMsg  . Count  (); ++  i  )
                    {
                         txt  =  new   Run  (  string .  Format  ( "[{0}]  {1}"  tmpMsg  [ i  ].  sender   tmpMsg  [  i ] . msgContent  ));
                         txt  . Foreground  =  Brushes  .  Wheat  ;
                         this  . Dispatcher  .  Invoke  ( DispatcherPriority  .  Normal   new Action  (() =>
                        {
                             lblTest  . Content  =  "ok"  ;
                             this .textBlocKMsgs . Inlines. Add (txt );
                             this  . textBlocKMsgs  .  Inlines .  Add  ( new  LineBreak  ());
                        }));
                    }
}
 
高亮的地方Run, 也是UI控件, 所以还是报错了, 把Invoke的范围放大一点,把Run的声明一起放进去就好了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值