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.rhkb.cn/news/41484.html

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

相关文章

深度剖析HTTP协议—GET/PUT请求方法的使用-构造请求的方法

活动发起人小虚竹 想对你说: 这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧&#xff01…

SQL中体会多对多

我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到JOINLEFT JOIN两种连接 1. 学生表(students) student_idstudent_name1张三2李四3王五 2. 课程表(courses&#xff09…

【android】补充

3.3 常用布局 本节介绍常见的几种布局用法,包括在某个方向上顺序排列的线性布局,参照其他视图的位置相对排列的相对布局,像表格那样分行分列显示的网格布局,以及支持通过滑动操作拉出更多内容的滚动视图。 3.3.1 线性布局Linea…

uv:Rust 驱动的 Python 包管理新时代

在 Python 包管理工具层出不穷的今天,pip、pip-tools、poetry、conda 等各有千秋。而今天要介绍的 uv,则是一款由 Astral 团队推出、采用 Rust 编写的全新工具,目标直指成为 “Python 的 Cargo”。它不仅在性能上表现优异,而且在功…

package.json版本前缀

前言 执行 npm i 下载依赖后,element-plus出现bug(单页面多个date-picker同时开启),这是 v2.9.0 的问题,但是项目 package.json 中版本如下: "element-plus": "^2.7.6",乍一看并不是…

CSS+JS 堆叠图片动态交互切换

结合DeepSeek提供的代码&#xff0c;终于实现了堆叠两张图片动态循环切换&#xff0c;以下是代码&#xff1a; 通过绝对定位放了两张图片 <div class"col-lg-5" style"z-index: 40; position: relative;"><img src"images/banner_1.png&quo…

SpringCould微服务架构之Docker(2)

Docker和虚拟机的差别&#xff1a; 虚拟机是在操作系统中模拟硬件设备&#xff0c;然后运行另外一个操作系统。

好用的Markdown阅读编辑器Typora破解记录

Typora破解 一、下载Typora二、安装Typora三、破解Typora &#x1f600; 记录一下Typora破解记录&#xff0c;怕不常用忘记咯&#xff0c;感觉自己现在的脑子就像我的肠子一样&#xff0c;刚装进去就么得了。。。&#x1f614; Typroa算是用起来很舒服的Markdown阅读器了吧&am…

UI前端与数字孪生:打造智慧城市的双引擎

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 随着信息技术的飞速发展&#xff0c;智慧城市的概念逐渐从理论走向实践。智慧城市旨在通过运用物联网…

“征服HTML引号恶魔:“完全解析手册”!!!(quot;表示双引号)

&#x1f6a8;&#x1f4e2; "征服HTML引号恶魔&#xff1a;“完全解析手册” &#x1f4e2;&#x1f6a8; &#x1f3af; 博客引言&#xff1a;当引号变成"恶魔" &#x1f631; 是否遇到过这种情况&#xff1a; 写HTML时满心欢喜输入<div title"他…

k8s高可用集群安装

一、安装负载均衡器 k8s负载均衡器 官方指南 1、准备三台机器 节点名称IPmaster-1192.168.1.11master-2192.168.1.12master-3192.168.1.13 2、在这三台机器分别安装haproxy和keepalived作为负载均衡器 # 安装haproxy sudo dnf install haproxy -y# 安装Keepalived sudo yum …

node.js笔记

1. Node.js基本概念 1.1 什么是Node.js Node.js是一个开源、跨平台的JavaScript运行环境&#xff0c;广泛应用于各类项目。它基于Google Chrome的V8 JavaScript引擎&#xff0c;性能卓越。 Node.js在单个进程中运行&#xff0c;利用异步I/O操作避免阻塞&#xff0c;能高效处…

关于在vscode中的Linux 0.11 应用程序项目的生成和运行

首先我们需要需要查看镜像文件 查看软盘镜像文件 floppyb.img 中的内容 在 VSCode 的“Terminal”菜单中选择“Run Build Task...”&#xff0c;会在 VSCode 的顶部中间位置弹出一个 可以执行的 Task 列表&#xff0c;选择其中的“打开 floppyb.img”后会使用 Floppy Editor …

【JavaScript 简明入门教程】为了Screeps服务的纯JS入门教程

0 前言 0-1 Screeps: World 众所不周知&#xff0c;​Screeps: World是一款面向编程爱好者的开源大型多人在线即时战略&#xff08;MMORTS&#xff09;沙盒游戏&#xff0c;其核心机制是通过编写JavaScript代码来控制游戏中的单位&#xff08;称为“Creep”&#xff09;&#…

【CSS文字渐变动画】

CSS文字渐变动画 HTML代码CSS代码效果图 HTML代码 <div class"title"><h1>今天是春分</h1><p>正是春天到来的日子&#xff0c;花都开了&#xff0c;小鸟也飞回来了&#xff0c;大山也绿了起来&#xff0c;空气也有点嫩嫩的气息了</p>…

【论文阅读】基于思维链提示的大语言模型软件漏洞发现与修复方法研究

这篇文章来自于 Chain-of-Thought Prompting of Large Language Models for Discovering and Fixing Software Vulnerabilities 摘要 软件安全漏洞在现代系统中呈现泛在化趋势&#xff0c;其引发的社会影响日益显著。尽管已有多种防御技术被提出&#xff0c;基于深度学习&…

SpringMVC_day02

一、SSM 整合 核心步骤 依赖管理 包含 SpringMVC、Spring JDBC、MyBatis、Druid 数据源、Jackson 等依赖。注意点&#xff1a;确保版本兼容性&#xff08;如 Spring 5.x 与 MyBatis 3.5.x&#xff09;。 配置类 SpringConfig&#xff1a;扫描 Service 层、启用事务管理、导入…

基于ADMM无穷范数检测算法的MIMO通信系统信号检测MATLAB仿真,对比ML,MMSE,ZF以及LAMA

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 ADMM算法 4.2 最大似然ML检测算法 4.3 最小均方误差&#xff08;MMSE&#xff09;检测算法 4.4 迫零&#xff08;ZF&#xff09;检测算法 4.5 OCD_MMSE 检测算法 4.6 LAMA检测算法 …

CSS动画

目录 一、核心概念与语法 1. keyframes 关键帧 2. animation 属性 二、动画调速函数&#xff08;animation-timing-function&#xff09; 1. 预设值 2. 贝塞尔曲线 3. 步进函数&#xff08;steps()&#xff09; 三、动画控制与交互 1. 暂停与恢复 2. JavaScript 控制…