WPF 跨线程访问UI控件(一)

本文介绍了在WPF中遇到的跨线程非法调用控件导致的`InvalidOperationException`异常,并提供了如何判断及解决此问题的方法。通过Dispatcher对象和线程比较,以及使用Invoke或BeginInvoke方法,演示了如何在非创建线程上安全地修改控件属性。

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

前言:

        在开发过程中,我们的程式会报 “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及时间信息。

        

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值