最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#實現(xiàn)線程回調(diào)的示例代碼

 更新時間:2025年12月19日 09:56:02   作者:wangnaisheng  
在 C# 中,線程回調(diào)是一種常見的編程模式,用于在線程完成任務(wù)后執(zhí)行某些操作,下面就來詳細(xì)的介紹一下線程回調(diào)的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下

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

回調(diào)機制

特點

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

性能分析

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

性能優(yōu)勢

  • 更快的執(zhí)行速度,因為沒有事件訂閱和分發(fā)的開銷。
  • 更少的內(nèi)存使用,避免了事件管理相關(guān)的額外開銷。

事件機制

特點

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

性能分析

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

性能劣勢

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

性能對比總結(jié)

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

以下是實現(xiàn)線程回調(diào)的幾種方法:

使用Thread類和委托

本文介紹了如何在C#中創(chuàng)建和管理線程以實現(xiàn)并發(fā)執(zhí)行,包括基本步驟、Lambda表達(dá)式簡化、線程間通信、數(shù)據(jù)共享與同步,以及ApartmentState在多線程和COM交互中的作用。

using System;
using System.Threading;

class Program
{
    // 定義一個委托,用于回調(diào)
    public delegate void CallbackDelegate(string message);

    static void Main(string[] args)
    {
        // 創(chuàng)建線程并傳遞回調(diào)方法
        Thread thread = new Thread(() => DoWork("線程任務(wù)完成!", Callback));
        thread.Start();

        Console.WriteLine("主線程繼續(xù)運行...");
        thread.Join(); // 等待線程完成
    }

    // 模擬線程執(zhí)行的任務(wù)
    static void DoWork(string message, CallbackDelegate callback)
    {
        Console.WriteLine("線程正在執(zhí)行任務(wù)...");
        Thread.Sleep(2000); // 模擬耗時操作
        callback?.Invoke(message); // 調(diào)用回調(diào)函數(shù)
    }

    // 回調(diào)方法
    static void Callback(string message)
    {
        Console.WriteLine($"回調(diào)執(zhí)行: {message}");
    }
}

輸出:

主線程繼續(xù)運行...
線程正在執(zhí)行任務(wù)...
回調(diào)執(zhí)行: 線程任務(wù)完成!

使用Task和ContinueWith

C# 提供了更高層次的并發(fā)工具 Task,可以通過 ContinueWith 實現(xiàn)線程回調(diào)。

using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        // 創(chuàng)建任務(wù)
        Task task = Task.Run(() =>
        {
            Console.WriteLine("任務(wù)正在執(zhí)行...");
            Thread.Sleep(2000); // 模擬耗時操作
        });

        // 使用 ContinueWith 實現(xiàn)回調(diào)
        task.ContinueWith(t =>
        {
            Console.WriteLine("回調(diào)執(zhí)行: 任務(wù)已完成!");
        });

        Console.WriteLine("主線程繼續(xù)運行...");
        task.Wait(); // 等待任務(wù)完成
    }
}

輸出:

主線程繼續(xù)運行...
任務(wù)正在執(zhí)行...
回調(diào)執(zhí)行: 任務(wù)已完成!

使用async/await和回調(diào)

結(jié)合 async/await 可以更優(yōu)雅地處理異步操作,并在任務(wù)完成后執(zhí)行回調(diào)。

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("主線程繼續(xù)運行...");

        // 執(zhí)行異步任務(wù)
        await DoWorkAsync();

        // 回調(diào)邏輯
        Callback();
    }

    static async Task DoWorkAsync()
    {
        Console.WriteLine("任務(wù)正在執(zhí)行...");
        await Task.Delay(2000); // 模擬耗時操作
    }

    static void Callback()
    {
        Console.WriteLine("回調(diào)執(zhí)行: 任務(wù)已完成!");
    }
}

輸出: 

主線程繼續(xù)運行...
任務(wù)正在執(zhí)行...
回調(diào)執(zhí)行: 任務(wù)已完成!

使用事件機制

通過定義事件和事件處理器,也可以實現(xiàn)線程完成后的回調(diào)。

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("線程任務(wù)完成!"));
        thread.Start();

        Console.WriteLine("主線程繼續(xù)運行...");
        thread.Join(); // 等待線程完成
    }

    static void DoWork(string message)
    {
        Console.WriteLine("線程正在執(zhí)行任務(wù)...");
        Thread.Sleep(2000); // 模擬耗時操作
        OnTaskCompleted?.Invoke(message); // 觸發(fā)事件
    }

    static void Callback(string message)
    {
        Console.WriteLine($"回調(diào)執(zhí)行: {message}");
    }
}

輸出:

主線程繼續(xù)運行...
線程正在執(zhí)行任務(wù)...
回調(diào)執(zhí)行: 線程任務(wù)完成!

總結(jié)

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

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

到此這篇關(guān)于C#實現(xiàn)線程回調(diào)的示例代碼的文章就介紹到這了,更多相關(guān)C# 線程回調(diào)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    詳解C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算

    這篇文章主要為大家詳細(xì)介紹了C#如何使用重載方法實現(xiàn)不同類型數(shù)據(jù)的計算,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-02-02
  • C#自定義集合初始化器

    C#自定義集合初始化器

    這篇文章介紹了C#自定義集合初始化器的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-07-07
  • C#的String和StringBuilder詳解

    C#的String和StringBuilder詳解

    這篇文章主要介紹了C#的String和StringBuilder詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • C#利用PaddleOCRSharp實現(xiàn)表格文字識別及可視化對比

    C#利用PaddleOCRSharp實現(xiàn)表格文字識別及可視化對比

    PaddleOCR 是百度飛槳開源的 OCR 工具庫,支持多語言文本識別,尤其在中文字符識別上表現(xiàn)優(yōu)異,在 C# 開發(fā)中,我們可以通過 PaddleOCRSharp 封裝庫快速集成 OCR 功能,本文將通過一個 WinForms 示例,演示如何實現(xiàn)圖片和 PDF 中的表格文字識別,需要的朋友可以參考下
    2026-02-02
  • C# Any()和AII()方法的區(qū)別

    C# Any()和AII()方法的區(qū)別

    本文主要介紹了C# Any()和AII()方法的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • C#中out與ref的區(qū)別實例解析

    C#中out與ref的區(qū)別實例解析

    這篇文章主要介紹了C#中out與ref的區(qū)別實例解析,對C#初學(xué)者有不錯的學(xué)習(xí)借鑒價值,需要的朋友可以參考下
    2014-08-08
  • C#實現(xiàn)winform漸變效果的方法

    C#實現(xiàn)winform漸變效果的方法

    這篇文章主要介紹了C#實現(xiàn)winform漸變效果的方法,涉及到窗體的設(shè)計與屬性的修改等技巧,需要的朋友可以參考下
    2014-10-10
  • C# ??祐isionmaster二次開發(fā)環(huán)境搭建

    C# ??祐isionmaster二次開發(fā)環(huán)境搭建

    本文主要介紹了C# ??祐isionmaster二次開發(fā)環(huán)境搭建,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2026-03-03
  • 輕松學(xué)習(xí)C#的String類

    輕松學(xué)習(xí)C#的String類

    輕松學(xué)習(xí)C#的String類,小編也是第一次接觸C#的String類,感興趣的小伙伴們可以參考一下,大家一起學(xué)習(xí)
    2015-11-11
  • C# DataSet查看返回結(jié)果集的實現(xiàn)

    C# DataSet查看返回結(jié)果集的實現(xiàn)

    這篇文章主要介紹了C# DataSet查看返回結(jié)果集的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10

最新評論

台中县| 崇明县| 周至县| 建瓯市| 闻喜县| 闻喜县| 江都市| 江孜县| 大悟县| 祥云县| 南宫市| 田东县| 西宁市| 搜索| 固始县| 城固县| 房产| 体育| 乐都县| 格尔木市| 巴林左旗| 海伦市| 大城县| 广平县| 花莲县| 隆德县| 大关县| 会同县| 吕梁市| 元谋县| 太仓市| 丘北县| 郧西县| 安新县| 马山县| 灵璧县| 西城区| 云霄县| 广东省| 淳安县| 中卫市|