The Solution of "The calling thread cannot access this object beacuse a different thread owns it." .

 

原文:http://blog.csdn.net/suqingheangle/article/details/6900411

       最近在用WPF做一个关于UI表现的程序,其中需要通过监视一个指定的文件夹,然后将其中新增的图片进行显示的操作。

        最简单的一行代码如下,此代码是为界面上的TextBlock元素指定值,如下:

view plain copy to clipboard print ?
  1. this.lstText.Text = "Test";  
this.lstText.Text = "Test";      因为UI层的控件和逻辑层不是同一线程进行控制,因此会导致加载时候出错,抛出如下的错误信息:The calling thread cannot access this object beacuse a different thread owns it.

      翻译成中文就是:[调用线程无法访问此对象,因为另一个线程拥有该对象。

  一种比较普遍的解决方法就是通过使用WPF的Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问 DispatcherObject。若要从不同于在其上创建 DispatcherObject 的线程的某个线程访问 DispatcherObject,请对与 DispatcherObject 关联的 Dispatcher 调用 Invoke 或 BeginInvoke。需要强制线程安全的 DispatcherObject 的子类可以通过对所有公共方法调用 VerifyAccess 来强制线程安全。这样可以保证调用线程是在其上创建 DispatcherObject 的线程。

  代码如下:

view plain copy to clipboard print ?
  1. lstText[i].Dispatcher.Invoke(new Action(() =>  
  2.                            {   
  3.                                this.lstText.Text = "Test";  
  4.                            }));  
lstText[i].Dispatcher.Invoke(new Action(() => { this.lstText.Text = "Test"; }));
   如此,则可以解决上述问题。
其他资料 http://www.silverlightchina.net/html/study/WPF/2011/0224/5611_2.html

你可能感兴趣的:(thread,UI,object,Access,action,WPF)