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.pswp.cn/web/73582.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/73582.shtml
英文地址,請注明出處:http://en.pswp.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后按回車,這三…