【C#】線程回調

在 C# 中,線程回調是一種常見的編程模式,用于在線程完成任務后執行某些操作。通過使用 Thread 類或其他更高層次的并發工具(如 Task),可以實現線程回調的功能。

回調機制

特點

  • 直接性:回調通常是通過委托(Delegate)直接調用的,邏輯簡單且明確。
  • 單一目標:回調一般只針對一個特定的目標方法。
  • 輕量級:由于沒有額外的中間層(如事件訂閱管理),回調的開銷較小。

性能分析

  • 調用開銷:回調本質上是一個方法調用,性能開銷非常低,幾乎等同于普通方法調用。
  • 內存分配:通常不會涉及額外的內存分配,除非需要創建閉包或匿名方法。
  • 適用場景
    • 單一任務完成后的通知。
    • 不需要解耦調用方和被調用方的場景。

性能優勢

  • 更快的執行速度,因為沒有事件訂閱和分發的開銷。
  • 更少的內存使用,避免了事件管理相關的額外開銷。

?

?事件機制

特點

  • 廣播性:事件可以支持多個訂閱者(多播委托),適合一對多的通知場景。
  • 解耦性:事件將發布者和訂閱者解耦,適合復雜系統中的模塊化設計。
  • 靈活性:可以通過動態添加或移除事件處理器來改變行為。

性能分析

  • 調用開銷
    • 如果只有一個訂閱者,事件的性能與回調類似。
    • 如果有多個訂閱者,事件需要遍歷所有訂閱者并逐一調用其處理方法,這會增加開銷。
  • 內存分配
    • 事件機制需要維護訂閱者的列表,可能會導致額外的內存分配。
    • 如果訂閱者頻繁地添加或移除,可能會引發垃圾回收的壓力。
  • 線程安全
    • 在多線程環境中,事件的訂閱和觸發可能需要加鎖或其他同步機制,進一步增加開銷。

性能劣勢

  • 多播委托的遍歷會導致性能下降,尤其是在訂閱者數量較多的情況下。
  • 額外的內存分配和垃圾回收壓力可能會影響性能。

?性能對比總結

特性回調事件
調用開銷低(直接調用方法)較高(可能需要遍歷多個訂閱者)
內存分配少(通常無額外分配)較多(需要維護訂閱者列表)
適用場景單一任務完成后的通知一對多的通知,模塊化設計
線程安全性簡單(通常無需額外同步)復雜(可能需要加鎖)
擴展性較差(只能通知單一目標)較好(支持動態添加/移除訂閱者)

?

以下是實現線程回調的幾種方法:

使用?Thread?類和委托

【C#】Thread的使用-CSDN博客文章瀏覽閱讀1.5k次,點贊10次,收藏26次。本文介紹了如何在C#中創建和管理線程以實現并發執行,包括基本步驟、Lambda表達式簡化、線程間通信、數據共享與同步,以及ApartmentState在多線程和COM交互中的作用。 https://blog.csdn.net/wangnaisheng/article/details/136051621?spm=1011.2415.3001.5331

using System;
using System.Threading;class Program
{// 定義一個委托,用于回調public delegate void CallbackDelegate(string message);static void Main(string[] args){// 創建線程并傳遞回調方法Thread thread = new Thread(() => DoWork("線程任務完成!", Callback));thread.Start();Console.WriteLine("主線程繼續運行...");thread.Join(); // 等待線程完成}// 模擬線程執行的任務static void DoWork(string message, CallbackDelegate callback){Console.WriteLine("線程正在執行任務...");Thread.Sleep(2000); // 模擬耗時操作callback?.Invoke(message); // 調用回調函數}// 回調方法static void Callback(string message){Console.WriteLine($"回調執行: {message}");}
}

輸出:

主線程繼續運行...
線程正在執行任務...
回調執行: 線程任務完成!

使用?Task?和?ContinueWith

C#中Task類的異步編程詳解:基礎用法與實踐-CSDN博客文章瀏覽閱讀1.8k次,點贊13次,收藏10次。C# Task的使用_c# task用法 https://blog.csdn.net/wangnaisheng/article/details/136036934?spm=1011.2415.3001.5331C# 提供了更高層次的并發工具 Task,可以通過 ContinueWith 實現線程回調。

using System;
using System.Threading.Tasks;class Program
{static void Main(string[] args){// 創建任務Task task = Task.Run(() =>{Console.WriteLine("任務正在執行...");Thread.Sleep(2000); // 模擬耗時操作});// 使用 ContinueWith 實現回調task.ContinueWith(t =>{Console.WriteLine("回調執行: 任務已完成!");});Console.WriteLine("主線程繼續運行...");task.Wait(); // 等待任務完成}
}

輸出:

主線程繼續運行...
任務正在執行...
回調執行: 任務已完成!

使用?async/await?和回調

C# async/await的使用_c# async await用法-CSDN博客文章瀏覽閱讀1.3k次,點贊5次,收藏8次。本文詳細介紹了C#中async和await關鍵字在實現異步編程中的作用,包括如何定義異步方法、await用于等待異步操作完成的特點,以及注意事項,如避免阻塞操作和正確嵌套。這些技術有助于提升程序性能和響應性。 https://blog.csdn.net/wangnaisheng/article/details/136037585?spm=1011.2415.3001.5331結合 async/await 可以更優雅地處理異步操作,并在任務完成后執行回調。

using System;
using System.Threading.Tasks;class Program
{static async Task Main(string[] args){Console.WriteLine("主線程繼續運行...");// 執行異步任務await DoWorkAsync();// 回調邏輯Callback();}static async Task DoWorkAsync(){Console.WriteLine("任務正在執行...");await Task.Delay(2000); // 模擬耗時操作}static void Callback(){Console.WriteLine("回調執行: 任務已完成!");}
}

輸出:?

主線程繼續運行...
任務正在執行...
回調執行: 任務已完成!

使用事件機制

通過定義事件和事件處理器,也可以實現線程完成后的回調。

using System;
using System.Threading;class Program
{// 定義事件public static event Action<string> OnTaskCompleted;static void Main(string[] args){// 訂閱事件OnTaskCompleted += Callback;// 啟動線程Thread thread = new Thread(() => DoWork("線程任務完成!"));thread.Start();Console.WriteLine("主線程繼續運行...");thread.Join(); // 等待線程完成}static void DoWork(string message){Console.WriteLine("線程正在執行任務...");Thread.Sleep(2000); // 模擬耗時操作OnTaskCompleted?.Invoke(message); // 觸發事件}static void Callback(string message){Console.WriteLine($"回調執行: {message}");}
}

輸出:

主線程繼續運行...
線程正在執行任務...
回調執行: 線程任務完成!

總結

  • Thread?+ 委托:適合簡單的線程回調場景。
  • Task?+?ContinueWith:推薦用于現代 C# 應用,簡潔且功能強大。
  • async/await:適用于異步編程,代碼更清晰。
  • 事件機制:適合需要解耦的場景,尤其是多個訂閱者的情況。

選擇合適的方法取決于具體的應用場景和需求。

?

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

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

相關文章

【C++游戲引擎開發】第14篇:視圖空間與相機坐標系

一、視圖空間的基礎數學框架 1.1 齊次坐標與變換矩陣 三維坐標系變換采用44齊次坐標矩陣,其通用形式為: M = [ A 3 3 b 3 1 0 1 3 1 ] \mathbf{M} = \begin{bmatrix} \mathbf{A}_{33} & \mathbf{b}_{31} \\ \mathbf{0}_{13} & 1 \end{bmatrix} M=[A33?013??…

【大模型理論篇】關于生成式模型中聯合分布概率學習必要性以及GPT是生成式模型的討論

1. 背景 之前我們在《生成式模型與判別式模型對比(涉及VAE、CRF的數學原理詳述)》以及《生成式模型算法原理深入淺出&#xff08;涉及Stable Diffusion、生成對抗網絡、高斯混合模型、隱馬爾可夫模型、樸素貝葉斯等算法原理分析及生成式模型解釋&#xff09;》中&#xff0c;我…

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述

DIP支付方式改革下各種疾病醫療費用的影響以及分析方法研究綜述 摘要 本文綜述了DIP支付方式改革對不同疾病醫療費用的影響及其分析方法&#xff0c;通過分析12篇相關文獻&#xff0c;探討了DIP支付方式在控制醫療費用、優化費用結構、提升醫療服務效率等方面的作用及其局限性…

嵌入式硬件篇---單片機周期

文章目錄 前言 前言 在單片機中&#xff0c;時序控制是其執行指令和協調外設的核心基礎。以下是單片機中常見的各種周期及其詳細說明&#xff0c;以層次結構展開&#xff1a; 時鐘周期&#xff08;Clock Cycle&#xff09; 定義&#xff1a; 時鐘周期是單片機的最小時間單位&a…

游戲引擎學習第221天:(實現多層次過場動畫)

資產: intro_art.hha 已發布 在下載頁面&#xff0c;你會看到一個新的藝術包。你將需要這個藝術包來進行接下來的開發工作。這個藝術包是由一位藝術家精心制作并打包成我們設計的格式&#xff0c;旨在將這些藝術資源直接應用到游戲中。它包含了許多我們會在接下來的直播中使用…

【3GPP核心網】【5G】精講5G系統的策略和計費控制框架

1. 歡迎大家訂閱和關注,精講3GPP通信協議(2G/3G/4G/5G/IMS)知識點,專欄會持續更新中.....敬請期待! 目錄 1. 系統架構 1.1 非漫游架構 1.2 漫游架構 1.3 支持Rx接口 2. 服務化接口及參考點 2.1 PCF 與 AF 間接口 2.2 PCF與SMF間接口 2.3 PCF與AMF間接口 2.4 V-PC…

榕壹云門店管理系統:基于Spring Boot+Mysql+UniApp的智慧解決方案

項目背景&#xff1a;數字化賦能服務行業&#xff0c;破解傳統門店管理痛點 在消費升級與數字化轉型浪潮下&#xff0c;傳統服務行業&#xff08;如美容、美發、美甲、采耳等&#xff09;面臨諸多管理挑戰&#xff1a;會員流失率高、預約排班混亂、員工績效統計低效、數據孤島等…

開發效率提升200%——cursor

cursor帶來的編程"革命" 高級語言編程轉為"自然語言編程"借助cursor&#xff0c;直接超越初級后臺開發、超越初級前端開發、超越初級測試、超越初級UI&#xff0c;產研一體linux命令只用學不用記&#xff0c;語言描述就是命令給一個表結構流程提示詞&…

UE4 踩坑記錄

1、Using git status to determine working set for adaptive non-unity build 我刪除了一個沒用的資源&#xff0c;結果就報這個錯&#xff0c;原因就是這條命令導致的&#xff0c; 如果這個項目是git項目&#xff0c; ue編譯時會優先通過 git status檢查哪些文件被修改&#…

藍橋杯 2025 C++組 省 B 題解

可分解的正整數 算法&#xff1a;思維 因為可以有負數 所以除了1以外的任何數都可以構造 當這個數為x構造方法為 -(x-1) -(x-2) -(x-3) ....-1 0 1...x-3 x-2 x-1 x 除了x&#xff0c;x以前的數都會被負數抵消 #include <bits/stdc.h> #define ll long long ll a…

docker創建容器添加啟動--restart選項

一、通過 Docker 命令直接修改已啟動的容器&#xff08;推薦-已驗證&#xff09; 操作步驟&#xff1a; 1.執行更新命令&#xff1a; docker update --restartalways <容器名或ID>此命令會將容器的重啟策略調整為 always&#xff08;無論容器以何種狀態退出&#xff0…

redission鎖釋放失敗處理

redission鎖釋放失敗處理 https://www.jianshu.com/p/055ae798547a 就是可以刪除 鎖的key 這樣鎖就釋放了&#xff0c;但是 還是要結合業務&#xff0c;這種是 非正規的處理方式&#xff0c;還是要在代碼層面進行處理。

【語音識別】vLLM 部署 Whisper 語音識別模型指南

目錄 1. 模型下載 2. 環境安裝 3. 部署腳本 4. 服務測試 語音識別技術在現代人工智能應用中扮演著重要角色&#xff0c;OpenAI開源的Whisper模型以其出色的識別準確率和多語言支持能力成為當前最先進的語音識別解決方案之一。本文將詳細介紹如何使用vLLM&#xff08;一個高…

Windows Server 2019 安裝 Docker 完整指南

博主本人使用的是離線安裝 1. 安裝前準備 系統要求 操作系統&#xff1a;Windows Server 2019&#xff08;或 2016/2022&#xff09;權限&#xff1a;管理員權限的 PowerShell網絡&#xff1a;可訪問互聯網&#xff08;或離線安裝包&#xff09; 啟用容器功能 Install-Win…

C# 混淆代碼工具--ConfuserEx功能與使用指南

目錄 1 前言1.1 可能帶來的問題 2 ConfuserEx2.1 簡介2.2 功能特點2.3 基本使用方法2.4 集成到MSBuild2.5 深入設置2.5.1 保護機制2.5.1.1 ConfuserEx Protection 2.5.2 精細的代碼保護主要特性1. decl-type(string)2.full-name(string)3. is-public()4. match(string)5. match…

c# 新建不重名的唯一文件夾

在源文件夾內創建唯一目標文件夾 string newFolder GetUniqueFolderName(sourceFolder); Directory.CreateDirectory(newFolder); /// <summary>/// 生成唯一文件夾名稱&#xff08;格式&#xff1a;新建文件夾、新建文件夾1、新建文件夾2...&#xff09;…

3D案例丨多個3D工業相機拼接檢測 開啟360°新視界

在高速生產線上&#xff0c;經常需要在極短的時間內對工件進行全方位的外觀檢測&#xff0c;如&#xff1a;線纜直徑和直線度檢測、鋰電池外觀缺陷檢測、鐵軌截面尺寸檢測等。 這需要傳感器完整還原被測物的截面面輪廓形狀&#xff0c;并獲取精準的截面輪廓數據。但單一相機的…

openapi + knife4j的使用

一、依賴作用與關系 1. springdoc-openapi-starter-webmvc-api ? 核心功能&#xff1a; 基于 OpenAPI 3 規范&#xff0c;自動生成 API 文檔元數據&#xff08;JSON 格式&#xff09;&#xff0c;并集成 Spring MVC。 提供Tag Operation、Schema 等注解&#xff0c;支持通過…

解決電腦問題——突然斷網!

電腦如果突然斷網是怎么回事 電腦突然斷網可能由多種原因造成&#xff0c;以下是常見的因素&#xff1a; 網絡連接與權限問題 路由器或調制解調器故障&#xff1a;路由器或調制解調器可能出現硬件故障、軟件故障或設置錯誤。可以嘗試重啟設備&#xff0c;如果問題依舊&#…

區塊鏈從專家到小白

文章目錄 含義應用場景典型特征 含義 以非對稱加密算法為基礎。 每個**區塊&#xff08;Block&#xff09;**包含&#xff1a; ?交易數據?&#xff08;如轉賬記錄、合約內容&#xff09;。 ?時間戳?&#xff08;記錄生成時間&#xff09;。 ?哈希值?&#xff08;當前區…