原文:http://blog.csdn.net/suqingheangle/article/details/6900411
最近在用WPF做一个关于UI表现的程序,其中需要通过监视一个指定的文件夹,然后将其中新增的图片进行显示的操作。
最简单的一行代码如下,此代码是为界面上的TextBlock元素指定值,如下:
- 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 的线程。
代码如下:
- lstText[i].Dispatcher.Invoke(new Action(() =>
- {
- this.lstText.Text = "Test";
- }));
如此,则可以解决上述问题。