欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談C#中的委托、事件與異步

 更新時間:2017年03月24日 08:57:47   投稿:sxyy  
本文主要介紹了C#中的委托、事件與異步的相關知識。具有很好的參考價值。下面跟著小編一起來看下吧

從剛接觸c#編程到現(xiàn)在,差不多快有一年的時間了。在學習過程中,有很多地方始終似是而非,直到最近才弄明白。

本文將先介紹用法,后評斷功能。

一、委托

基本用法:

1.聲明一個委托類型。委托就像是‘類'一樣,聲明了一種委托之后就可以創(chuàng)建多個具有此種特征的委托。(特征,指的是返回值、參數(shù)類型)

public delegate void SomeKindOfDelegate(string result);

2.創(chuàng)建一個在1中創(chuàng)建的委托類型的委托。

public SomeKindOfDelegate aDelegate;

3.為2中創(chuàng)建的具體的委托添加響應函數(shù)。響應函數(shù)必須符合1中的‘特征'。

aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
private void aFunctionThatJustForDelegate(string result)
{
MessageBox.Show(result);
}

4.完成以上三步之后,就可以使用Invoke來對委托進行調(diào)用了。Invoke可以選擇調(diào)用的目標函數(shù),調(diào)用優(yōu)先級,以及調(diào)用的參數(shù)。

aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);

上面是基本用法,除了這種基本用法之外,還可以結合var、匿名委托、lambda委托等方法。

完整代碼:

namespace wtfIsDelegate
{
 public delegate void SomeKindOfDelegate(string result);
 public partial class Form1 : Form
 {
  public event SomeKindOfDelegate aDelegate;
  public Form1()
  {
   InitializeComponent();
   aDelegate +=new SomeKindOfDelegate(aFunctionThatJustForDelegate);
   aDelegate.BeginInvoke("Hello~I'm being invoked!", null, null);
  }
  private void btnDelegate_Click(object sender, EventArgs e)
  {
  }
  private void aFunctionThatJustForDelegate(string result)
  {
   MessageBox.Show(result);
  }
 }
}

委托的用處:

委托的優(yōu)點,是可以實現(xiàn)異步(BeginInvoke),還可以在某種需要同時調(diào)用多個同參數(shù)、返回值的情況下簡化代碼。

二、事件

基本用法:

1.定義委托。

public delegate void SomeKindOfDelegate(string result);

2.定義事件。

public event SomeKindOfDelegate aDelegate;

3.為事件添加響應函數(shù)。

process.Exited += new EventHandler(CmdProcess_Exited);

4.為事件規(guī)定觸發(fā)(調(diào)用)方式。(【也可以沒有觸發(fā)方式,直接invoke】)

解說:

C#里,每一種‘事件Event'大概都對應著其‘事件處理者EventHandler'。比如Process類的OutputDataReceived事件對應著DataReceivedEventHandler,對于非特異性的‘事件',比如PasswordChanged 這種,它們統(tǒng)一都對應著RoutedEventHandler或者EventHandler這種較為通用的‘事件處理者'。然而,‘EventHandler'也只是充當了一個中介的角色,真正觸發(fā)了‘Event'之后要做什么,還需要我們手動指定,像這樣:

process.Exited += new EventHandler(CmdProcess_Exited); // 注冊進程結束事件 。

EventHandler本來也是委托。比如

public delegate void DataReceivedEventHandler(object sender, DataReceivedEventArgs e);

自定義事件

自定義事件是一種類似于委托的方式,

自定義事件某種意義上改變了程序的流程,使得某個條件的變化由‘不斷查詢'轉變?yōu)椤嗛喤c處理'的關系。

自定義事件需要有以下幾個元素:

事件的發(fā)起者,事件的訂閱,以及事件的處理程序。從發(fā)起者到處理程序之間是可以傳參數(shù)的。

一個事件的‘發(fā)起'可以依賴于某種系統(tǒng)消息,比如‘OnKeyDown'、‘OnMouseClick'(【我目前還沒見過這么寫的源碼】),也可以在某個條件達成時(比如兩次輸入了同樣的字符)自行調(diào)用(其實收到系統(tǒng)消息也算是‘條件達成')?!靖嗟膃vent是這么寫出來的】

有些事件,并沒有明顯的‘發(fā)起者'。

委托和事件是啥關系

委托和自定義事件的使用方式十分十分類似。event 只有類的內(nèi)部可以 Invoke,delegate的話,在哪都可以Invoke。調(diào)用的方式貌似也略有區(qū)別(傳參方式)

由于調(diào)用方式和傳參的差異,event顯得更保守/穩(wěn)定一些。event也更容易從‘理解'上更容易接受。

delegate貌似更多的用于進行異步(begin invoke)。而event則更多的用來做自定義事件。

委托和異步是啥關系

異步是委托可以實現(xiàn)的一種功能(或者叫做‘現(xiàn)象'也可以) 異步可以由很多種其他方式體現(xiàn),比如多線程(thread,threadpool,task等等)。

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學習或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關文章

  • C#新手常犯的錯誤匯總

    C#新手常犯的錯誤匯總

    這篇文章主要介紹了C#新手常犯的錯誤匯總,對于經(jīng)驗豐富的C#程序員同樣具有很好的參考借鑒價值,需要的朋友可以參考下
    2014-08-08
  • C#自定義序列化ISerializable的實現(xiàn)方法

    C#自定義序列化ISerializable的實現(xiàn)方法

    這篇文章主要介紹了C#自定義序列化ISerializable的實現(xiàn)方法,涉及C#序列化的操作技巧,非常具有實用價值,需要的朋友可以參考下
    2015-04-04
  • C#科學繪圖之使用scottPlot繪制多個圖像

    C#科學繪圖之使用scottPlot繪制多個圖像

    ScottPlot是基于.Net的一款開源免費的交互式可視化庫,支持Winform和WPF等UI框架,本文主要為大家詳細介紹了如何使用scottPlot實現(xiàn)繪制多個圖像,需要的可以參考下
    2023-12-12
  • C#操作Access通用類實例

    C#操作Access通用類實例

    這篇文章主要介紹了C#操作Access通用類,實例分析了C#操作access的各種常見技巧,非常具有實用價值,需要的朋友可以參考下
    2015-06-06
  • WPF利用RPC調(diào)用其他進程的方法詳解

    WPF利用RPC調(diào)用其他進程的方法詳解

    這篇文章主要給大家介紹了關于WPF利用RPC調(diào)用其他進程的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-05-05
  • C#實現(xiàn)DVD借出歸還管理系統(tǒng)

    C#實現(xiàn)DVD借出歸還管理系統(tǒng)

    這篇文章主要介紹了C#實現(xiàn)DVD借出歸還管理系統(tǒng),類似DVD管理器,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • C#使用鉤子獲得按鍵信息的方法

    C#使用鉤子獲得按鍵信息的方法

    這篇文章主要介紹了C#使用鉤子獲得按鍵信息的方法,實例分析了C#中鉤子的相關使用技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-05-05
  • C#截圖程序類似騰訊QQ截圖實現(xiàn)代碼

    C#截圖程序類似騰訊QQ截圖實現(xiàn)代碼

    拖動過程中顯示當前鼠標下一小塊的圖像信息 尺寸、顏色信息的 注意 這里顏色是用的ARGB,需要的朋友可以參考下
    2012-12-12
  • C#中后臺post請求常用的兩種方式總結

    C#中后臺post請求常用的兩種方式總結

    這篇文章主要介紹了C#中后臺post請求常用的兩種方式總結,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 詳解C#設計模式編程中的模板方法模式使用

    詳解C#設計模式編程中的模板方法模式使用

    這篇文章主要介紹了C#設計模式編程中的模板方法模式,模板方法模式比較好理解,即設定好算法骨架以后進行代碼的反復利用,需要的朋友可以參考下
    2016-02-02

最新評論