C#WPF多线程控件访问问题

WPF多线程直接访问界面的控件的解决方式 .net编程支持多线程直接访问界面的控件(界面创建线程与访问线程不是同一个线程),但是可以可以使用delegate来解决。 相应的解决方法如下:   WPF:Dispatcher.Invoke 方法,只有在其上创建 Dispatcher 的线程才可以直接访问DispatcherObject。若要从不同于在其上创建 DispatcherObject 的线程的某个线程访 阅读详情

C#(WPF)多线程,涉及控件访问问题

在程序涉及复杂大量计算时,通常需要用另外开个后台线程进行计算,让程序能响应其他的操作,防止出现卡死现象。然而,经常在计算结束后,需要将结果显示到界面的某个控件上,这就需要在新开的线程里访问主线程的UI控件,这会出现不能跨线程访问的问题。下面介绍两种解决方式。

方法1:Dispatcher.Invoke()

public void DoWork()
{
 	// 在这里面写要让计算机后台进行的代码操作

	//计算完后,将结果给TextBox时,采用下面代码
	this.TB.Dispatcher.Invoke(new Action(()=>
	{
		this.TB.text = 计算结果;
	}));
}

// 创建一个线程,将要进行后台计算的方法传入
ThreadStart threadStear = new ThreadStart(DoWork);
Thread thd = new Thread(threadStear);
// 开启线程
thd.Start();

方法2:BackgroundWorker()

BackgroundWorker是建立一个后台线程,其中常见的包含2个内容,一个是后台计算内容,另一个是计算结束后要执行的内容,这样就能把大量计算放一个方法里,把计算结束后的对主线程控件的访问放另为一个方法里。

// 定义一个要让后台线程计算的内容的方法,在这个方法里千万不要去访问主线的控件.
 private void work_DoWork(object sender, DoWorkEventArgs args)
 {
      //写大量计算的内容,不要包含对主线线程的控件访问  
 }

// 定义一个上面的DoWork执行完毕后要执行的内容,可以直接对控件进行访问
private void work_work_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{
	this.textbox.text = 计算结果;
}

// 声明一个后台线程
BackgroundWorker work = new BackgroundWorker();
// 后台线程要执行的工作添加进线程
work.DoWork += work_DoWork;
// 后台线程工作完,自动要执行的内容添加进去
work.RunWorkerCompleted += work_RunWorkerCompleted;

// 开启线程工作,该方法会自动调用work_DoWork,完成后自动执行work_RunWorkerCompleted
working.RunWorkerAsync();

BackgroundWorker 可以在RunWorkkerCompleted里直接对主线线程里的控件进行访问,并且该方法会在计算的内容完成后自动调用。比较推荐使用方法2。

如何使用C# WPF中的Dispatcher进行性能优化? 在 C# WPF 中使用 Dispatcher 进行性能优化,需结合线程调度机制、消息队列管理和 UI 更新策略。通过合理组合上述优化策略,可使 WPF 应用在多线程场景下保持流畅响应,典型场景下可降低 UI 线程 CPU 占用 30-70%,内存使用减少 40-60%。 阅读详情

相关推荐

数学建模入门——数据预处理(全)

介绍了数据预处理的入门知识

n04j04h06的博客 4347

C#中的Dispatcher:Invoke与BeginInvoke的使用

Dispatcher是.NET框架中的一个重要概念,用于处理异步消息传递。在C#中,Dispatcher提供了两种方法:Invoke和BeginInvoke,用于控制线程上消息的顺序和执行方式。

故事不长丨的博客 7350

【Kingbase人大金仓】授权文件更换

本文介绍了金仓数据库授权文件更换的步骤:1.通过ksql或客户端工具查询数据库版本;2.在官网下载对应版本的license.bat文件;3.替换前先备份原授权文件(使用tar命令压缩),再用新文件覆盖原文件。注意事项包括:版本号需严格对应,授权文件通常位于安装目录下,可使用find命令查找具体位置。操作需谨慎,建议先备份原文件以便恢复。

qq_34463511的博客 3459

C#Dispatcher.Invoke()方法

前言 当客户端需要进行网络下载操作时如果只是简单的用多线程这么一个操作而不给用户知道当前的下载进度的话那么用户将不知道已经下载了多少,甚至有可能直接关闭了主应用程序。那就杯具了。 那么如何在另外的线程中来更新UI? 讨论 WPF却明确的规定:UI元素只能由其主线程来操作,其他任何线程都不可以直接操作UI。 WPF中的UI控件,如果我们探究本质,他们都是从DispatcherObject继承,所以都...

WYJ的博客 2万+

Android Camera Sensor HDR详解

本文详细介绍了Android相机传感器(Sensor)中实现高动态范围(HDR)采集的各种技术方式。主要内容包括: Sensor HDR技术分类 帧内HDR(Single-Frame HDR):在同一帧同一像素内完成多增益采集,无运动伪影和帧率损失,包括DAG(双模拟增益)、DCG(双转换增益)等技术 帧间HDR(Multi-Frame HDR):通过多帧曝光实现,如DOL(数字重叠)、Staggered HDR等 混合HDR:结合多种技术的复合方案 详细技术原理 重点解析了DAG和DCG两种主流帧内HDR

DU_YULIN的博客 360

ICCV 2025 | 哈工大、清华等提出首个双曲学习框架:HLFormer,革新局部相关视频检索

离原点越远,代表的语义越具体(部分)。现有方法大多在传统的欧几里得空间中对视频和文本进行建模,但这往往会导致对视频内在层次结构的错误表示,从而影响检索的准确性。通过UMAP对学习到的帧嵌入进行可视化(如下图),可以观察到,来自同一时刻的视频帧在嵌入空间中聚集在一起,清晰地展示了模型对时序关系的捕捉能力。下图的双曲空间可视化进一步证实了模型的层次建模能力:离原点越近的点,代表的语义层级越高、粒度越粗糙,反之亦然。:既然文本查询描述的是视频的一部分,那么在几何表示上,文本的嵌入向量应该从属于视频的嵌入向量。

我爱计算机视觉 1082

C#中关于Dispatcher中Invoke和BeginInvoke的总结

C#中关于Dispatcher中Invoke和BeginInvoke的总结

LGZ521520的博客 5274

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

轴承寿命预测 | 基于BiLSTM双向长短期记忆神经网络的轴承寿命预测附matlab完整代码

默默科研仔的博客 274

c#多线程以及Dispatcher.Invoke

主线程 private void Stabilitybutton_Click(object sender, RoutedEventArgs e) { for (int Nr = 0; Nr <= 10; Nr++) { byte[] msg = ne

青阳十五的专栏 1万+

基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真

新能源微电网是现代电力系统的重要组成部分,能够有效整合分布式能源(如光伏、风力发电)和储能设备,实现局部区域内的能源高效利用。微电网的运行控制涉及多源能量管理、负荷平衡以及并网/孤岛模式切换等关键问题。基于MATLAB/Simulink平台进行新能源微电网运行控制的建模与仿真,可以帮助研究者验证控制策略的有效性,并优化系统的动态性能和经济性。本项目旨在构建一个完整的新能源微电网模型,包括电源模块、储能模块、负荷模块以及控制器模块,并通过仿真分析其运行特性。

xiaoheshang_123的博客 424

OpenHarmony深度定制:从系统到模块的全景剖析与自定义模块实战

目标:在中新增一个算法库,让产品可直接调用。关闭不用的 20+ 系统部件,ROM 缩小 50 %;为自家芯片新增专用驱动模块,快速点亮开发板;内将核心算法库以部件形式集成,实现商业闭源。万物互联时代,差异化才是护城河。

m0_67505153的博客 1036

C#中Invoke的用法---------多线程操作:线程间操作无效,从不是创建控件的线程访问它

设计一个界面,点击button之后,改变label的值 实现:点击button执行button的click事件,在函数下创建一个线程change,然后在这个线程中执行改变label的方法ChangeLabel(); 说明:控件是在UI主线程中创建的,进入控件的事件响应函数时,是在控件所在的线程,并不是主线程。在控件的事件响应函数中改变控件的状态,可能与主线程发生线程冲突。 若直接用以下的写法,必...

欢迎私信、留言交流 2345

实战:RK3568 Android14 调试 MIPI DSI 液晶屏

LCD1_RST -> 对应原理图网络连接到 GPIO。LCD1_PWR_EN ->用于给屏幕 VCC 供电。LCD0_BL_EN / LCD0_BL_PWM -> MP3302 升压芯片驱动 LED 灯条。![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/100f2be7f763494da1032464e272e63b.png&pinctrl {/* 配置 LCD_RST 和 LCD_EN */

qq_33427070的博客 1549

做C#开发时遇到的一些问题

做C#开发时遇到的一些问题 C#winform中的textBox控件在输入时无法居中,也没有其属性可以更改。 解决方案:选中该textBox控件然后再Font属性把字体格式更改为Microsoft Sans Serif。tips:此方案只能使竖直居中。 C#整理代码快捷键是什么 解决方案:快捷键 → Ctrl + K + D 如何使ListView始终显示最底层( 最新 )的内容...

qq_33501751的博客 407

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

博客摘录「 关于C#下面的Invoke 和在WPF中使用的Dispatcher.Invoke的区别」2024年7月17日

在此重新学习一下Dispatcher.Invoke的定义:从主 UI 线程派生的后台线程不能更新的内容 Button UI 线程上创建。为了使后台线程访问的内容属性的 Button, ,后台线程必须将工作委托给 Dispatcher 与 UI 线程关联。这通过使用实现 Invoke 或 BeginInvoke。Invoke 是同步和BeginInvoke 是异步的。

github_35460278的博客 212

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于C#下面的Invoke 和在WPF中使用的Dispatcher.Invoke的区别

在此重新学习一下Dispatcher.Invoke的定义: 从主 UI 线程派生的后台线程不能更新的内容  Button UI 线程上创建。 为了使后台线程访问的内容属性的  Button, ,后台线程必须将工作委托给  Dispatcher 与 UI 线程关联。 这通过使用实现  Invoke 或  BeginInvoke。 Invoke 是同步和 BeginInvoke 是异步的。    ...

Andrewniu的博客 6077

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C#的方法 Dispatcher.Invoke =>

Dispatcher.Invok是WPF中特有的。使用方法如下 1)创建一个“WPF 引用程序” 2)在Window1.xaml中添加一个Label 3)在后台代码Window1.xaml.cs中 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15...

lmm0513的博客 5977

WPF Dispatcher.Invoke()和Dispatcher.BeginInvoke()

它允许将消息委托给指定的线程池来处理,从而避免了阻塞当前线程。该方法接受一个代表操作的对象和一个可选的超时时间。使用BeginInvoke方法时,消息将立即传递给线程池处理,而不会等待操作完成。它确保在调用该方法时,当前线程上的消息队列中的消息会被依次处理。使用Invoke方法时,当前线程会阻塞,直到指定的消息被处理完毕。

SJ15630070060的博客 1366

C#(WPF)跨线程调用控件

参考:WPF中窗口控件的跨线程调用 在用C#写PC上位机的时候,难免会用到多线程,多出的线程又难免会用到主现程的UI控件,但是,UI是不能直接跨线程使用的。 在WinForm中,我们要跨线程访问窗口控件,只需要设置属性CheckForIllegalCrossThreadCalls = false;即可。 在WPF中要麻烦一下,在WPF中的窗口控件都有一个Dispatcher属性,允许访问控件的线程;既然不允许直接访问,就告诉控件我们要干什么就好了。 加入以下一段代码: priva

2567

C# Dispatcher.Invoke方法

这个东西的作用, 说白了就是辅线程不能更改UI的内容, 若要更改就需要用到这个东西。 下面内容来自https://www.cnblogs.com/smallerpig/p/3646230.html 前一篇小猪分享过在WPF中简单的使用BackgroundWorker完成多线程操作!在那篇中小猪利用了BackgroundWorker组件对耗时比较多的操作放在了单独的BackgroundWorker里...

ln2037的博客 1444

WPF UI多线程:Dispatcher正确使用方式

在WPF应用开发中,你是否遇到过以下问题: - 后台任务更新UI时抛出"调用线程无法访问此对象,因为另一个线程拥有该对象"异常 - 长时间运算导致界面卡顿失去响应 - 异步操作完成后无法正确更新数据绑定 - 程序在高负载下出现随机的UI崩溃 这些问题的根源都指向WPF的单线程公寓模型(STA)限制。WPF UI元素只能由创建它们的线程(通常是主线程)访问和修改。**Dispatcher(调度器)...

gitblog_00824的博客 1575

在WPF 4.5中跨线程更新集合

WPF中一个非常强大的功能是数据绑定,我们可以把一个集合绑定到ListBox中,当集合的数据发生变更时,ListBox界面也会同步变更。本身这是一个非常美好的事情,但是美中不足的是:当把集合绑定到ListBox中的时候,集合也顺带继承了ListBox的这种不能夸线程访问的限制。例如,如下代码就会抛出跨线程访问异常。 解决这个问题的一个传统方式是把对集合的修改Post到UI线程中来,改成如下形...

weixin_34352449的博客 251

WPF中Dispatcher的初步探讨

    今天要专门讲一下Dispatcher,原因是WPF中经常碰到多线程下软件界面控件的更新问题。相信很多初步接触WPF的界面开发的朋友,为了保持界面不卡,在一个自己创建的线程中去更新或者读取一个控件时都会遇到了一个很奇怪的Exception异常,显示如下:    这个异常是告诉我们,不好意思您非法操作了。    这个问题我个人认为估计99.9%的人都碰到过。因此,很多人觉得微软的WPF真不好用...

皮皮君的博客 6633

C# WPF Dispatcher.Invoke的用法(解决其他类中控制窗口线程的控件出错的问题)

WPF中每个xaml文件都有一个.cs文件进行后台操作但是有的时候,我想在其他类操作这个窗口的某个控件,直接通过类对象进行操作会出错(不考虑Binding)如下代码:&lt;ListBox x:Name ="listBox" HorizontalAlignment="Left" Height="100" Margin="37,77,0,0" VerticalAlignment="Top" Widt..

qq_36282233的博客 5337

不同线程访问同一控件导致的不安全错误解决办法

WinForm不同线程访问同一控件导致的不安全错误解决办法错误原因分析解决方案 错误原因分析 造成这一错误的原因通常是非创建该控件的线程操作了这个控件,比如主线程创建了窗口A,分线程要关掉窗口A。因为程序并不能确定主线程是不是在操作这个窗口,所以盲目的关闭这个窗口会造成不可预料的错误!(当然,只要你逻辑清楚是不会出错的,但是编译器还是要强制进行安全检查) 解决方案 对于这个问题,最好的解决方案是通...

qq_38310070的博客 499
上一篇: Numpy中高维axis的操作个人理解
下一篇: 数据归一化、标准化和去中心化
lsjmax
博客等级 码龄11年 92粉丝 24原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值