C#中UI線程的切換與后臺線程的使用

文章速覽

  • UI線程切換
    • 示例
  • 后臺線程使用
    • 示例
  • 兩者對比
    • 適用場景
      • Application.Current.Dispatcher.Invoke
      • Task.Factory.StartNew
    • 執行同步性
      • Application.Current.Dispatcher.Invoke
      • Task.Factory.StartNew

一個贊,專屬于你的足跡!

UI線程切換

在WPF應用程序中,UI元素只能由創建其的線程(通常UI線程)進行訪問和修改。當我們從非UI線程嘗試訪問UI元素時,就需要通過使用【Application.Current.Dispacher.Invoke】將操作切換到UI線程。

示例

假設有一個按鈕點擊事件,在后臺線程中進行一些處理后需要更新 UI 文本框的內容:

private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 后臺線程中處理數據string result = LongRunningOperation();// 使用 Dispatcher.Invoke 更新 UIApplication.Current.Dispatcher.Invoke(() =>{textBox.Text = result;});});
}
private string LongRunningOperation()
{// 模擬耗時操作Thread.Sleep(3000);return "Result";
}

后臺線程使用

當進行計算密集型任務或者耗時的操作(如數據處理、網絡請求等),可以使用 【Task.Factory.StartNew】啟動一個新線程來完成。

此處可以結合著同步、異步、并發來思考。
相關文章:
同步、異步、并發的區別

示例

如果只需要進行后臺計算而不需要更新 UI:

private void Button_Click(object sender, RoutedEventArgs e)
{Task.Factory.StartNew(() =>{// 在后臺線程中執行計算任務int result = CalculateResult();// 這里沒有更新 UI 的操作});
}
private int CalculateResult()
{// 模擬計算任務Thread.Sleep(2000);return 42;
}

兩者對比

適用場景

Application.Current.Dispatcher.Invoke

主要用于需要更新 UI 的情況。
例如,在多線程程序中,當一個后臺線程完成了數據的計算或獲取,需要將結果顯示在 UI 上(如更新文本框、列表框等控件的內容),此時就需要使用 Application.Current.Dispatcher.Invoke 將更新 UI 的代碼放到 UI 線程來執行。

Task.Factory.StartNew

更適用于需要并行處理任務的場景。比如,同時處理多個文件的讀寫操作,或者同時進行多個網絡請求,或者執行一些復雜的計算任務,而這些任務不需要頻繁地更新 UI。通過 Task.Factory.StartNew 可以有效地利用多核 CPU 的性能,提高程序的執行效率。

執行同步性

Application.Current.Dispatcher.Invoke

Invoke 方法是同步執行的。當調用 Invoke 時,調用線程(通常是后臺線程)會一直等待直到 UI 線程完成指定的操作后才會繼續執行后續的代碼。這意味著如果 Invoke 中的操作比較耗時,調用線程會被阻塞。

Task.Factory.StartNew

一般用于啟動異步任務。
任務一旦啟動,它會在后臺線程池中獨立運行,調用線程(一般是 UI 線程)不會等待任務完成就繼續執行后續代碼。不過,可以通過一些同步機制(如 Wait、Result 等)來等待任務完成,但這不是默認的行為。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/81376.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/81376.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/81376.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【HTML】個人博客頁面

目錄 頁面視圖?編輯 頁面代碼 解釋&#xff1a; HTML (<body>): 使用了更加語義化的HTML5標簽&#xff0c;例如<header>, <main>, <article>, <footer>。文章列表使用了<article>包裹&#xff0c;結構清晰。添加了分頁導航。使用了Font…

第J1周:ResNet-50算法實戰與解析

&#x1f368; 本文為&#x1f517;365天深度學習訓練營 中的學習記錄博客 &#x1f356; 原作者&#xff1a;K同學啊 我的環境 語言環境:Python3.8 編譯器:Jupyter Lab 深度學習環境:Pytorchtorch1.12.1cu113 torchvision0.13.1cu113 一、準備工作 二、導入數據 三、劃分數據…

養生:健康生活的極簡攻略

在追求高效生活的當下&#xff0c;養生也能化繁為簡。通過飲食、運動、睡眠與心態的精準調節&#xff0c;就能輕松為健康續航。 飲食上&#xff0c;遵循 “均衡、節制” 原則。早餐用一杯熱豆漿搭配水煮蛋和半個蘋果&#xff0c;喚醒腸胃活力&#xff1b;午餐以糙米飯為主食&am…

遷移 Visual Studio Code 設置和擴展到 VSCodium

本文同步發布在個人博客 遷移 Visual Studio Code 設置和擴展到 VSCodium - 萑澈的寒舍https://hs.cnies.org/archives/vscodium-migrateVisual Studio Code&#xff08;以下簡稱 VS Code&#xff09;無疑是當下最常用的代碼編輯器。盡管微軟的 VS Code 源代碼采用 MIT 協議開…

力扣654題:最大二叉樹(遞歸)

小學生一枚&#xff0c;自學信奧中&#xff0c;沒參加培訓機構&#xff0c;所以命名不規范、代碼不優美是在所難免的&#xff0c;歡迎指正。 標簽&#xff1a; 二叉樹、遞歸 語言&#xff1a; C 題目&#xff1a; 給定一個不重復的整數數組 nums 。最大二叉樹可以用下面的算…

離散制造企業WMS+MES+QMS+條碼管理系統高保真原型全解析

在離散型制造企業的生產過程中&#xff0c;庫存管理混亂、生產進度不透明、質檢流程繁瑣等問題常常成為制約企業發展的瓶頸。為了幫助企業實現全流程數字化管控&#xff0c;我們精心打造了一款基于離散型制造企業&#xff08;涵蓋單件生產、批量生產、混合生產模式&#xff09;…

Linux操作系統--進程間通信(system V共享內存)

目錄 1.system V共享內存 2.共享內存數據結構 3.共享內存函數 4.實例代碼&#xff1a; 1.system V共享內存 共享內存區是最快的IPC(進程間通信)形式。一旦這樣的內存映射到共享它的進程地址空間&#xff0c;這些進程間數據傳遞不再涉及到內核&#xff0c;換句話說是進程不再…

【C++】類與對象

目錄 1、類的定義 2、類的訪問限定符及封裝 3、類的實例化 4、類和對象的大小 5、this 指針 6、類的六個默認成員函數 構造函數 析構函數 拷貝構造函數 賦值重載函數 取地址運算符的重載函數 7、運算符重載 8、const 成員函數 9、 static 成員 10、友元 11、…

現代簡約中式通用,民國畫報風,中國風PPT模版8套一組分享

中國風PPT模版分享&#xff1a;中國風PPT模版分享https://pan.quark.cn/s/abbf75507c5f 第1套PPT模版&#xff1a;棕色調中式窗欞封面&#xff0c;水墨山水背景配白梅與燈籠流蘇&#xff0c;適用于教學課件目錄設計&#xff0c;展現濃郁的書卷氣息。 第2套PPT模版&#xff1a;米…

django擴展練習記錄

一、Django 中使用 django-apscheduler 實現定時任務 可以方便地管理周期性任務&#xff08;如每天清理緩存、定時發送郵件等&#xff09; 1. 安裝 pip install django-apscheduler -i https://pypi.tuna.tsinghua.edu.cn/simple #0.7.02.添加到應用&#xff0c;python m…

Guided Filtering相關記錄

一、背景介紹 以前折騰保邊濾波時候&#xff0c;刷了一些Guided Filtering相關資料。這里主要是對它們做個算法效果復現和資料簡單整理。 二、Guided Filtering 1、基本原理 原版Guided Filtering的提出&#xff0c;主要是為了改善雙邊濾波做保邊平滑濾波器時候的梯度翻轉偽影…

知識圖譜系列(2):知識圖譜的技術架構與組成要素

1. 引言 知識圖譜作為一種強大的知識表示和組織方式,已經在搜索引擎、推薦系統、智能問答等多個領域展現出巨大的價值。在之前的上一篇文章中,我們介紹了知識圖譜的基礎概念與發展歷程,了解了知識圖譜的定義、核心特征、發展歷史以及在AI發展中的地位與作用。 要深入理解和…

操作系統|| 虛擬內存頁置換算法

題目 寫一個程序來實現 FIFO 和 LRU 頁置換算法。首先&#xff0c;產生一個隨機的頁面引用序列&#xff0c;頁面數從 0~9。將這個序列應用到每個算法并記錄發生的頁錯誤的次數。實現這個算法時要將頁幀的數量設為可變。假設使用請求調頁。可以參考所示的抽象類。 抽象類&…

開發與AI融合的Windsurf編輯器

Windsurf編輯器是開發人員和人工智能真正融合在一起的地方&#xff0c;提供了一種感覺像文字魔術的編碼體驗。 手冊&#xff1a;Windsurf - Getting Started 下載鏈接&#xff1a;Download Windsurf Editor for Windows | Windsurf (formerly Codeium) 下載安裝 從上面的下載…

【Java】網絡編程(Socket)

網絡編程 Socket 我們開發的網絡應用程序位于應用層&#xff0c;TCP和UDP屬于傳輸層協議&#xff0c;在應用層如何使用傳輸層的服務呢&#xff1f;在應用層和傳輸層之間&#xff0c;則使用套接字Socket來進行分離 套接字就像是傳輸層為應用層開的一個小口&#xff0c;應用程…

【教程】Docker方式本地部署Overleaf

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 目錄 背景說明 下載倉庫 初始化配置 修改監聽IP和端口 自定義網站名稱 修改數據存放位置 更換Docker源 更換Docker存儲位置 啟動Overleaf 創…

根據用戶ID獲取所有子節點數據或是上級直屬節點數據

一、根據用戶ID獲取所有子節點&#xff0c;通過存儲過程來實現 CREATE DEFINERcrmeb% PROCEDURE proc_get_user_all_children( IN rootUid INTEGER, -- 要查詢的根用戶ID IN includeSelf BOOLEAN -- 是否包含自身(1包含,0不包含) ) BEGIN -- 聲明變…

計算機組成原理——數據的表示

2.1數據的表示 整理自Beokayy_ 1.進制轉換 十六進制與二進制的轉換 一位十六進制等于四位二進制 四位二進制等于一位十六進制 0x173A4C0001 0111 0011 1010 0100 1100 十六進制與十進制的轉換 十六轉十&#xff1a;每一位數字乘以相應的16的冪再相加 十轉十六&#xff1a…

基于MATLAB-GUI圖形界面的數字圖像處理

基于MATLAB GUI的數字圖像處理系統實現方案&#xff0c;包含常見圖像處理功能。代碼分為兩部分&#xff1a;GUI界面設計和回調函數實現。 %% 第一部分&#xff1a;創建GUI界面 (使用GUIDE) % 1. 打開GUIDE: guide % 2. 創建新GUI&#xff0c;添加以下控件&#xff1a; % - …

從裸機開發到實時操作系統:FreeRTOS詳解與實戰指南

從裸機開發到實時操作系統&#xff1a;FreeRTOS詳解與實戰指南 本文將帶你從零開始&#xff0c;深入理解嵌入式系統中的裸機開發與實時操作系統&#xff0c;以FreeRTOS為例&#xff0c;全面剖析其核心概念、工作原理及應用場景。無論你是嵌入式新手還是希望提升技能的開發者&am…