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

C# EventHandler的使用詳解(最新整理)

 更新時(shí)間:2025年10月28日 09:46:18   作者:wangnaisheng  
在C#中,EventHandler是一種特殊的委托類型,專門(mén)用于事件處理,它定義在System命名空間中,并且通常用來(lái)實(shí)現(xiàn)發(fā)布-訂閱模式,這是 .NET 框架中處理事件的標(biāo)準(zhǔn)方式,下面通過(guò)本文給大家介紹C# EventHandler的使用,感興趣的朋友跟隨小編一起看看吧

一、C#中EventHandler的使用詳解

1.什么是EventHandler

EventHandler是.NET Framework中預(yù)定義的委托類型,專門(mén)用于表示不生成數(shù)據(jù)的事件的事件處理程序方法。它是事件處理模型的核心組件。

EventHandler的標(biāo)準(zhǔn)簽名

public delegate void EventHandler(object sender, EventArgs e);
  • 第一個(gè)參數(shù)object sender - 事件源(引發(fā)事件的對(duì)象)
  • 第二個(gè)參數(shù)EventArgs e - 事件數(shù)據(jù)(如果事件不生成數(shù)據(jù),則使用EventArgs.Empty

事件處理的基本流程

  1. 定義事件(發(fā)布者類中)
  2. 注冊(cè)事件處理程序(訂閱者類中)
  3. 觸發(fā)事件(發(fā)布者類中)
  4. 處理事件(訂閱者類中)

2.基本用法示例

1. 定義事件(發(fā)布者類)

public class Publisher
{
    // 定義事件 - 無(wú)數(shù)據(jù)事件
    public event EventHandler MyEvent;
    // 觸發(fā)事件的方法(推薦使用空值檢查)
    protected virtual void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
    // 觸發(fā)事件的公共方法
    public void TriggerEvent()
    {
        OnMyEvent();
    }
}

2. 定義事件處理程序(訂閱者類)

public class Subscriber
{
    public void HandleMyEvent(object sender, EventArgs e)
    {
        Console.WriteLine("事件已觸發(fā)!");
        // 可以訪問(wèn)sender對(duì)象,如:((Publisher)sender).SomeProperty
    }
}

3. 事件注冊(cè)與觸發(fā)

public class Program
{
    static void Main()
    {
        Publisher publisher = new Publisher();
        Subscriber subscriber = new Subscriber();
        // 注冊(cè)事件處理程序
        publisher.MyEvent += subscriber.HandleMyEvent;
        // 觸發(fā)事件
        publisher.TriggerEvent();
        // 可選:移除事件處理程序
        publisher.MyEvent -= subscriber.HandleMyEvent;
    }
}

3.泛型版本:EventHandler

當(dāng)事件需要傳遞自定義數(shù)據(jù)時(shí),應(yīng)使用泛型版本EventHandler<TEventArgs>

// 自定義事件參數(shù)類
public class CustomEventArgs : EventArgs
{
    public string Message { get; set; }
    public int Value { get; set; }
}
// 發(fā)布者類
public class DataPublisher
{
    public event EventHandler<CustomEventArgs> DataProcessed;
    protected virtual void OnDataProcessed(CustomEventArgs e)
    {
        DataProcessed?.Invoke(this, e);
    }
    public void ProcessData(string message, int value)
    {
        // 處理數(shù)據(jù)...
        OnDataProcessed(new CustomEventArgs { Message = message, Value = value });
    }
}
// 訂閱者
public class DataSubscriber
{
    public void HandleDataProcessed(object sender, CustomEventArgs e)
    {
        Console.WriteLine($"收到數(shù)據(jù): {e.Message}, 值: {e.Value}");
    }
}

4.常見(jiàn)使用技巧與注意事項(xiàng)

1. 空值檢查(避免NullReferenceException)

// 錯(cuò)誤示范(可能導(dǎo)致異常)
MyEvent(this, EventArgs.Empty); 
// 正確做法(空值檢查)
MyEvent?.Invoke(this, EventArgs.Empty);

2. 事件線程安全(多線程環(huán)境)

// 線程安全的事件觸發(fā)
var handler = Volatile.Read(ref MyEvent);
handler?.Invoke(this, EventArgs.Empty);

3. 使用Lambda表達(dá)式注冊(cè)事件

publisher.MyEvent += (sender, e) => 
{
    Console.WriteLine("通過(guò)Lambda處理事件");
};

4. 事件注銷(避免內(nèi)存泄漏)

// 在訂閱者銷毀時(shí)注銷事件
public class Subscriber : IDisposable
{
    private Publisher _publisher;
    public Subscriber(Publisher publisher)
    {
        _publisher = publisher;
        _publisher.MyEvent += HandleEvent;
    }
    public void Dispose()
    {
        _publisher.MyEvent -= HandleEvent;
    }
    private void HandleEvent(object sender, EventArgs e)
    {
        // 事件處理邏輯
    }
}

5.與委托的關(guān)系

  • 事件本質(zhì)上是封裝了委托的類成員,提供了對(duì)委托的結(jié)構(gòu)化訪問(wèn)
  • 事件只允許添加、刪除或調(diào)用事件處理程序,不能直接訪問(wèn)底層委托
  • 事件提供了更安全的事件處理機(jī)制,避免了直接操作委托可能帶來(lái)的問(wèn)題

6.總結(jié)

EventHandler是C#中處理事件的標(biāo)準(zhǔn)委托類型,使用它可以使代碼更加清晰、安全和可維護(hù)。在實(shí)際應(yīng)用中,應(yīng):

  1. 對(duì)于無(wú)數(shù)據(jù)事件,使用EventHandler
  2. 對(duì)于需要傳遞數(shù)據(jù)的事件,使用EventHandler<TEventArgs>
  3. 始終進(jìn)行空值檢查
  4. 在適當(dāng)?shù)臅r(shí)候注銷事件處理程序,避免內(nèi)存泄漏

通過(guò)合理使用EventHandler,可以實(shí)現(xiàn)發(fā)布者和訂閱者之間的松耦合通信,這是C#事件模型的核心思想。

二、EventHandler與Event、EventWaitHandle得區(qū)別以及聯(lián)系?

1. 概念定義

EventHandler

  • 類型:.NET中預(yù)定義的委托類型
  • 作用:表示不生成數(shù)據(jù)的事件的事件處理程序方法
  • 簽名public delegate void EventHandler(object sender, EventArgs e);
  • 使用場(chǎng)景:用于定義事件處理程序的方法簽名
  • 關(guān)鍵點(diǎn):是事件處理的"方法簽名規(guī)范"

Event

  • 類型:C#關(guān)鍵字
  • 作用:用于聲明事件,是委托類型的特殊包裝
  • 使用方式public event EventHandler MyEvent;
  • 關(guān)鍵點(diǎn):提供安全的事件注冊(cè)機(jī)制,只能使用+=-=操作,不能直接賦值

EventWaitHandle

  • 類型:.NET Framework中的類(位于System.Threading命名空間)
  • 作用:用于線程同步,表示系統(tǒng)事件
  • 主要類型
    • AutoResetEvent:自動(dòng)重置事件
    • ManualResetEvent:手動(dòng)重置事件
  • 關(guān)鍵點(diǎn):用于多線程環(huán)境中的線程同步,與事件處理無(wú)關(guān)

2. 區(qū)別對(duì)比

特性EventHandlerEventEventWaitHandle
本質(zhì)委托類型C#關(guān)鍵字.NET類
命名空間SystemC#語(yǔ)言特性System.Threading
主要用途事件處理程序的簽名規(guī)范事件聲明線程同步
使用方式作為委托類型使用public event EventHandler MyEvent;EventWaitHandle event = new AutoResetEvent(false);
與事件處理的關(guān)系事件處理程序的簽名事件聲明無(wú)直接關(guān)系
是否用于事件處理

3. 詳細(xì)解釋與聯(lián)系

EventHandler 和 Event 的聯(lián)系

  • 緊密關(guān)系EventHandlerevent最常用的委托類型
  • 典型用法
public class Publisher
{
    // 使用EventHandler作為委托類型定義事件
    public event EventHandler MyEvent;
    protected virtual void OnMyEvent()
    {
        MyEvent?.Invoke(this, EventArgs.Empty);
    }
}

為什么需要Event:直接使用委托類型(如EventHandler)作為事件成員,會(huì)導(dǎo)致訂閱者可以隨意賦值,破壞事件處理的安全性。event關(guān)鍵字限制了只能通過(guò)+=-=來(lái)添加和移除事件處理程序。

EventHandler 和 EventWaitHandle 的區(qū)別

  • 完全不同的概念
    • EventHandler用于UI事件、自定義事件處理
    • EventWaitHandle用于線程同步,與事件處理機(jī)制無(wú)關(guān)
  • 應(yīng)用場(chǎng)景
    • EventHandler:按鈕點(diǎn)擊、數(shù)據(jù)變化等UI事件
    • EventWaitHandle:線程間通信、等待特定條件滿足

Event 和 EventWaitHandle 的區(qū)別

  • Event:C#語(yǔ)言特性,用于實(shí)現(xiàn)發(fā)布-訂閱模式
  • EventWaitHandle:.NET類庫(kù)中的同步原語(yǔ),用于線程同步
  • 無(wú)直接聯(lián)系:它們解決的是完全不同的問(wèn)題

4. 實(shí)際使用示例

EventHandler + Event (事件處理)

public class Button
{
    public event EventHandler Click;
    public void OnClick()
    {
        Click?.Invoke(this, EventArgs.Empty);
    }
}
public class Form
{
    public void Initialize()
    {
        Button button = new Button();
        // 使用EventHandler注冊(cè)事件處理
        button.Click += (sender, e) => Console.WriteLine("Button clicked!");
    }
}

EventWaitHandle (線程同步)

// 創(chuàng)建事件
AutoResetEvent autoEvent = new AutoResetEvent(false);
// 線程1:等待事件
Thread thread1 = new Thread(() =>
{
    Console.WriteLine("Thread 1: Waiting for event...");
    autoEvent.WaitOne();
    Console.WriteLine("Thread 1: Event received!");
});
// 線程2:觸發(fā)事件
Thread thread2 = new Thread(() =>
{
    Thread.Sleep(2000);
    Console.WriteLine("Thread 2: Setting event...");
    autoEvent.Set();
});
thread1.Start();
thread2.Start();

5. 總結(jié)

  • EventHandler是事件處理程序的簽名規(guī)范,是一個(gè)委托類型
  • Event是C#關(guān)鍵字,用于聲明事件,提供安全的事件注冊(cè)機(jī)制
  • EventWaitHandle是.NET中用于線程同步的類,與事件處理機(jī)制無(wú)關(guān)

關(guān)鍵區(qū)別

  • EventHandlerevent事件處理機(jī)制的核心組成部分
  • EventWaitHandle線程同步機(jī)制的一部分,與事件處理無(wú)關(guān)

簡(jiǎn)單記憶

  • 事件處理(UI事件、自定義事件)用 EventHandler + event
  • 線程同步用 EventWaitHandle(AutoResetEvent/ManualResetEvent)

這三者在.NET框架中都與"事件"有關(guān),但解決的是完全不同的問(wèn)題,不能混淆使用。

三、其他

【C#】Event的使用

【C#】EventWaitHandle的用法

到此這篇關(guān)于C# EventHandler的使用的文章就介紹到這了,更多相關(guān)C# EventHandler使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 雜談try-catch-finally異常處理

    雜談try-catch-finally異常處理

    這篇文章主要介紹了雜談try-catch-finally異常處理的相關(guān)資料,需要的朋友可以參考下
    2016-01-01
  • C#圖像亮度調(diào)整的方法

    C#圖像亮度調(diào)整的方法

    這篇文章主要介紹了C#圖像亮度調(diào)整的方法,涉及C#操作圖像亮度的相關(guān)技巧,需要的朋友可以參考下
    2015-04-04
  • 開(kāi)源一個(gè)c# 新的雪花算法

    開(kāi)源一個(gè)c# 新的雪花算法

    這篇文章主要介紹了開(kāi)源一個(gè)c# 新的雪花算法的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#實(shí)現(xiàn)Quartz任務(wù)調(diào)度的示例代碼

    C#實(shí)現(xiàn)Quartz任務(wù)調(diào)度的示例代碼

    使用 Quartz.NET,你可以很容易地安排任務(wù)在應(yīng)用程序啟動(dòng)時(shí)運(yùn)行,或者每天、每周、每月的特定時(shí)間運(yùn)行,甚至可以基于更復(fù)雜的調(diào)度規(guī)則,本文給大家介紹了C#實(shí)現(xiàn)Quartz任務(wù)調(diào)度,需要的朋友可以參考下
    2024-04-04
  • C# 文件安全管理需要注意的

    C# 文件安全管理需要注意的

    這篇文章主要介紹了C# 文件安全管理需要注意的,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C#利用Random得隨機(jī)數(shù)求均值、方差、正態(tài)分布的方法

    C#利用Random得隨機(jī)數(shù)求均值、方差、正態(tài)分布的方法

    這篇文章主要介紹了C#利用Random得隨機(jī)數(shù)求均值、方差、正態(tài)分布的方法,涉及C#數(shù)學(xué)運(yùn)算及概率統(tǒng)計(jì)的相關(guān)技巧,需要的朋友可以參考下
    2015-05-05
  • C#讀取目錄下所有指定類型文件的方法

    C#讀取目錄下所有指定類型文件的方法

    這篇文章主要介紹了C#讀取目錄下所有指定類型文件的方法,可實(shí)現(xiàn)讀取目錄下特定后綴名文件的功能,需要的朋友可以參考下
    2015-06-06
  • C#飛機(jī)打字游戲的代碼示例(winform版)

    C#飛機(jī)打字游戲的代碼示例(winform版)

    這篇文章主要介紹了C#飛機(jī)打字游戲的代碼示例(winform版),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • C#實(shí)現(xiàn)異步編程的方法

    C#實(shí)現(xiàn)異步編程的方法

    這篇文章主要為大家詳細(xì)介紹了C#實(shí)現(xiàn)異步編程的方法,什么是異步,如何實(shí)現(xiàn)異步編程,感興趣的小伙伴們可以參考一下
    2017-07-07
  • C#連接MySQL的兩個(gè)簡(jiǎn)單代碼示例

    C#連接MySQL的兩個(gè)簡(jiǎn)單代碼示例

    這篇文章主要介紹了C#連接MySQL的簡(jiǎn)單代碼示例,需要的朋友可以參考下
    2017-06-06

最新評(píng)論

苏尼特左旗| 乡城县| 林芝县| 台东市| 炉霍县| 高雄市| 寿光市| 正镶白旗| 沙坪坝区| 牟定县| 固原市| 西吉县| 乐安县| 鹿邑县| 横峰县| 临夏市| 石阡县| 五莲县| 芜湖市| 雷州市| 尚义县| 新密市| 应用必备| 南宫市| 龙海市| 思南县| 出国| 界首市| 高台县| 商河县| 确山县| 五莲县| 资溪县| 宁德市| 湖北省| 抚宁县| 博爱县| 台东县| 昌黎县| 聂拉木县| 化隆|