前言:
在开发过程中,我们的程式会报 “InvalidOperationException” 的异常。该异常产生的一个原因是由于进行了跨线程非法调用控件,即在非创建控件的线程上访问该控件。什么意思呢,通俗的讲:线程ThreadA创建了控件ControlA,线程ThreadB去访问这个控件(ControlA)就会产生上述异常。那么,要在ThreadB中访问控件ControlA,该如何实现呢?也就是如何实现跨线程访问UI控件呢,下面将探讨这个问题。
概述:
在Windows Form 中,每个控件都有一个BOOL 型 属性 InvokeRequired,该属性表示当前访问的线程是否为创建它的线程,值为FALSE表示不是。在WPF中,控件没有InvokeRequired属性,我们通过Dispatcher.Thread属性和当前线程(System.Threading.Thread.CurrentThread)进行比较判断当前访问的线程是否为创建它的线程。无论是Windows Form 还是WPF,若当前线程非控件创建线程则通过控件的Invoke方法或BeginInvoke、EndInvoke方法进行访问。下面通过WPF的例子进行说明。
Demo1--简单的跨线程设置属性值
前面板如图,由一个TextBlock控件和一个Button控件构成。实现功能,点击Click后,TextBlock将显示访问它的线程ID及时间信息。