c#在work线程中怎样更新UI控件

最近笔者调试修改项目,碰到了c#在work线程中怎样更新UI控件中的场景,简单总结了下,主要有两个方法:

方法1:通过System.Windows.Application.Current.Dispatcher.Invoke来更新UI控件

 System.Windows.Application.Current.Dispatcher.Invoke(() =>{ConnectCheckBox.IsChecked = false;});

方法2:通过SynchronizationContext实现,具体细节如下:

SynchronizationContext.Post 函数:主要用于在 Windows Forms 或者 WPF 等 UI 相关的应用程序中,以异步的方式将一个委托(在这里是 SetTextSafePost 方法)投递到指定的同步上下文(m_SyncContext)中执行,下面详细展开解释其作用和原理。

1. 同步上下文(SynchronizationContext)的概念

在 Windows Forms 或者 WPF 应用程序中,UI 控件(如 ListViewTextBox 等)是线程不安全的,这意味着只有创建这些控件的线程(通常是主线程,也就是 UI 线程)才能够访问和修改它们。如果在其他线程中直接访问和修改 UI 控件,会抛出 InvalidOperationException 异常。

SynchronizationContext 类提供了一种机制,允许在不同线程之间安全地切换执行上下文,确保在访问 UI 控件时是在 UI 线程中进行的。在 Windows Forms 应用程序中,SynchronizationContext.Current 会返回当前线程的同步上下文,对于 UI 线程来说,这个同步上下文会确保委托在 UI 线程中执行。

2. m_SyncContext.Post 方法的作用

m_SyncContext.Post 方法用于将一个委托异步投递到指定的同步上下文中执行。它接受两个参数:

  • 第一个参数是一个 SendOrPostCallback 委托,这个委托指向要执行的方法(在这里是 SetTextSafePost 方法)。
  • 第二个参数是传递给委托方法的参数(在这里是 lvi,即 ListViewItem 对象)。

Post 方法会将委托放入同步上下文的消息队列中,然后立即返回,不会等待委托执行完成。同步上下文会在合适的时机(通常是 UI 线程处理消息队列时)从消息队列中取出委托并在 UI 线程中执行。

private void SetTextSafePost(object lvi)
{if (AlarmabsListView.Items.Count > 100){AlarmabsListView.Items.RemoveAt(100);}ListViewItem temp = lvi as ListViewItem;AlarmabsListView.Items.Insert(0, temp);
}private static SynchronizationContext m_SyncContext = null;// 在某个地方初始化同步上下文,通常在 UI 线程中进行
m_SyncContext = SynchronizationContext.Current;// ...if (strJson.ToLower().Contains("\"testInfo\""))
{    ListViewItem lvi = new ListViewItem();lvi.Text = heartBeat.EventNotificationAlert.dataTime;lvi.SubItems.Add(heartBeat.EventNotificationAlert.eventType);lvi.SubItems.Add(strJson);m_SyncContext.Post(SetTextSafePost, lvi);
}

4. 与 Send 方法的区别

SynchronizationContext 类还有一个 Send 方法,它与 Post 方法的区别在于:

  • Post 方法是异步的,它会将委托放入消息队列中,然后立即返回,不会等待委托执行完成。
  • Send 方法是同步的,它会等待委托执行完成后才返回。

在处理 UI 控件时,通常建议使用 Post 方法,以避免阻塞当前线程。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/73582.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构每日一题day3(顺序表)★★★★★

题目描述:顺序表L的元素递增有序排列,设计一个算法在插入元素x后保持该顺序表仍然递增有序排列,插入成功后返回插入元素所在位置,不成功返回-1 算法思想:在递增有序的顺序表中插入元素 x 并保持有序性,步骤如下: 合法…

MyBatis中mapper.xml 的sql映射规则

一、SQL 映射文件核心元素 MyBatis 映射文件的顶级元素(按定义顺序): cache:命名空间的缓存配置。cache-ref:引用其他命名空间的缓存。resultMap:自定义结果集映射。sql:可重用的 SQL 片段。i…

【计算机网络】计算机网络协议、接口与服务全面解析——结合生活化案例与图文详解

协议、接口与服务 导读一、协议1.1 定义1.2 组成 二、接口三、服务3.1 定义3.2 服务与协议的区别3.3 分类3.3.1 面向连接服务于无连接服务3.3.2 可靠服务和不可靠服务3.3.3 有应答服务和无应答服务 结语 导读 大家好,很高兴又和大家见面啦!!…

Ubuntu服务器中Swapper如何与虚拟内存配合

在Ubuntu服务器中,Swapper和虚拟内存是操作系统中重要的概念,它们共同协作以提高系统的内存管理效率。当物理内存不足时,Swapper会帮助系统将不活跃的数据从内存转移到磁盘上的交换空间(Swap),以释放内存给需要更多资源的进程。下…

SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景

以下是 SQL Server 中常见的数据类型及其详细解释、内存占用和适用场景: 数据类型类别数据类型解释内存占用适用场景整数类型bigint用于存储范围较大的整数,范围是 -2^63 (-9,223,372,036,854,775,808) 到 2^63-1 (9,223,372,036,854,775,807)8 字节需要…

vue数字公式篇 Tinymce结合使用(二)

继上一篇的数字公式 , 这次的功能是将公式能插入编辑器以及修改 1、Tinymce 自定义 LateX 按钮,打开公式编辑器窗口 LateX.vue window.tinymce.init({...//基础配置这里我就不写了setup(ed) {//自定义 LateX 按钮ed.ui.registry.addButton(LateX, {text:…

python数据增强和转换

数据增强和转换 固定转换随机转换概率控制的转换 固定转换 边缘补充像素(Pad)尺寸变换(Resize)中心截取(CenterCrop)顶角及中心截取(FiveCrop)尺灰度变换(GrayScale) 概率控制的转换 随机垂直翻转(RandomVerticalFlip)随机应用(RandomApply) # -*- coding: utf-8 -*- fro…

Ubuntu下UEFI安全启动安装Nvdia驱动

简介 众所周知,Ubuntu默认使用Nouveau开源驱动,其性能受限,因此我们需要安装Nvidia专用驱动。 安装专用驱动的一般方法非常简单,只需要sudo ubuntu-drivers devices && sudo ubuntu-drivers autoinstall即可&#xff0c…

05_循环结构三目运算符

目录 一、双重for循环 练习 二、break关键字 三、continue 关键字 练习 四、三元运算 / 三目运算 一、双重for循环 外层循环 循环一次,,,内层循环 循环一圈!!! 循环里嵌套循环: for(var…

数据结构初阶-二叉树链式

目录 1.概念与结构 2.二叉数链式的实现 2.1遍历规则 2.2申请内存空间 2.3手动构建一棵二叉树 2.4二叉树结点的个数 2.5二叉树叶子结点的个数 2.6二叉树第K层结点个数 2.7二叉树的高度 2.8二叉树中查找值为x的结点 2.9二叉树的销毁 3.层序遍历 3.1概念 3.2层序遍历…

鸿蒙HarmonyOS NEXT之无感监听

鸿蒙中存在一些无感监听,这些监听经过系统API封装使用很简单,但是对实际业务开发中有很重要,例如埋点业务、数据统计、行为上报、切面拦截等。 Navigation的页面切换 在鸿蒙中Navigation被用来作为路由栈进行页面跳转,如果你想知…

批量处理word里面表格的空白行

1,随便打开一个word文档。 2,按下Alt F11 VBA编辑器,在左侧的「工程资源管理器」窗口中找到Normal 项目,右键选择插入->模块。 弹出一下弹窗 3,输入一下代码 代码: Sub RemoveEmptyTableRows()Dim tbl As TableDim row As R…

3ds Max 2026 新功能全面解析

一、视口性能与交互体验升级 1. Hydra 2.0 视口渲染引擎 3ds Max 2026 引入了 Hydra 2.0,大幅优化了视口渲染性能,尤其是在处理复杂场景和高质量实时预览时,流畅度提升显著。 支持USD(通用场景描述)格式&#xff0c…

JVM垃圾回收笔记02-垃圾回收器

文章目录 前言1.串行(Serial 收集器/Serial Old 收集器)Serial 收集器Serial Old 收集器相关参数-XX:UseSerialGC 2.吞吐量优先(Parallel Scavenge 收集器/Parallel Old 收集器)Parallel Scavenge 收集器Parallel Old 收集器相关参数-XX:UseParallelGC ~ -XX:UseParallelOldGC-…

图解AUTOSAR_SWS_UDPNetworkManagement

AUTOSAR UDP 网络管理 (UdpNm) 技术详解 基于 AUTOSAR 规范的 UDP 网络管理模块可视化指南 目录 AUTOSAR UDP 网络管理 (UdpNm) 技术详解 目录1. 概述2. UdpNm 状态机 2.1 状态机概述2.2 主要状态说明2.3 状态转换机制2.4 并行状态3. UdpNm 架构设计 3.1 架构概述3.2 接口设计3…

android 图形开发的技能学习路线

需要以下几个方面的知识: OpenGL ES的基础和高级应用图形渲染管线的工作原理3D数学(矩阵、向量、四元数)着色器编程(GLSL)libGDX框架的使用和定制性能优化和内存管理跨平台渲染技术 接下来,考虑如何结构化…

使用AI一步一步实现若依(26)

功能26:新增一个新员工培训页面 功能25:角色管理 功能24:菜单管理 功能23:从后端获取路由/菜单数据 功能22:用户管理 功能21:使用axios发送请求 功能20:使用分页插件 功能19:集成My…

vue响应式原理剖析

一、什么是响应式? 我们先来看一下响应式意味着什么?我们来看一段代码: m有一个初始化的值,有一段代码使用了这个值; 那么在m有一个新的值时,这段代码可以自动重新执行; let m = 20 console.log(m) console.log(m * 2)m = 40上面的这样一种可以自动响应数据变量的代码机…

无人机航电系统电池技术解析!

1. 常用电池类型 锂聚合物电池(LiPo) 特点:高能量密度、轻量化、放电效率高,是目前主流选择。 缺点:对过充/过放敏感,需严格管理,存在轻微膨胀或起火风险。 锂离子电池(Li-ion…

ubuntu下终端打不开的排查思路和解决方法

问题现象描述:ubuntu开机后系统桌面显示正常,其他图形化的app也都能打开无异常,唯独只有terminal终端打不开,无论是鼠标点击终端软件,还是ctrlaltt,还是altF2后输入gnome-terminal后按回车,这三…