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

詳解C#中通過委托來實(shí)現(xiàn)回調(diào)函數(shù)功能的方法

 更新時(shí)間:2016年04月25日 17:52:20   作者:aiqier  
這篇文章主要介紹了C#中通過委托來實(shí)現(xiàn)回調(diào)函數(shù)功能的方法,文中舉了一個(gè)典型的多線程回調(diào)程序?qū)嵗?需要的朋友可以參考下

委托(delegate)是一種可以把引用存儲(chǔ)為函數(shù)的類型,這類似于c++中的函數(shù)指針。

回調(diào)函數(shù)
c++中的回調(diào)函數(shù),就是用函數(shù)指針來實(shí)現(xiàn)的。類似的,c#中用委托,來實(shí)現(xiàn)回調(diào)函數(shù)的功能。

回調(diào)函數(shù)為什么被稱為回調(diào)函數(shù)?比如你調(diào)用了一個(gè)函數(shù),那么就叫調(diào)用,但是如果你在調(diào)用一個(gè)函數(shù)的時(shí)候,還需要把一個(gè)函數(shù)提供給該函數(shù),讓這個(gè)函數(shù)來調(diào)用你的函數(shù),那么你提供的這個(gè)函數(shù)就被稱為回調(diào)函數(shù)(callback)。

對于python這樣的動(dòng)態(tài)語言而言,就沒有c#,c++提供特殊的語法實(shí)現(xiàn)回調(diào)函數(shù),因?yàn)樵趐ython中,函數(shù)也是一個(gè)對象,無論是當(dāng)參數(shù)傳,還是當(dāng)函數(shù)的返回值,都不會(huì)有問題。

回調(diào)函數(shù)還被用來當(dāng)作一個(gè)“插件”:

在C++的STL庫中,排序函數(shù)的具體算法已經(jīng)被實(shí)現(xiàn),但是兩個(gè)元素的具體比較辦法,通過回調(diào)函數(shù)提供(比較函數(shù)),保證該算法可用于int,string等不同類型。

void sort( iterator start, iterator end );
void sort( iterator start, iterator end, StrictWeakOrdering cmp );

c#委托
委托常常被使用在事件處理中。因?yàn)榭梢詫⑹录|發(fā)后的具體操作(該做哪些事情)委托給實(shí)現(xiàn)類。這個(gè)就是好萊塢法則,“Don't call me, I will call you”。

這個(gè)例子來源于c#經(jīng)典入門:

delegate double ProcessDelegate(double param1, double param2);

static double Multiply(double param1, double param2)
{
  return param1 * param2;
}

staitc double Divide(double param1, double param2)
{
  return param1 / param2;
}

if (input == "M")
  process = new ProcessDelegate(Multiply);
else
  process = new ProcessDelegate(Divide);

但真實(shí)情況我們并不通過邏輯判斷初始化回調(diào)函數(shù),下面的這個(gè)函數(shù)插件的例子更常見。

static void ExecuteFunction(ProcessDelegate process)
{
process(2.2, 3.3);
}

C#委托實(shí)現(xiàn)回調(diào)的實(shí)例:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 
using System.Threading; 
 
namespace Stockes 
{ 
  public partial class CallBack : Form 
  { 
    public CallBack() 
    { 
      InitializeComponent(); 
      //初始化回調(diào)方法 
      writeBoxCallback1 = new WriteBoxCallback1(Write1); 
      writeBoxCallbacK2 = new WriteBoxCallback2(Write2); 
    } 
    //聲明委托已實(shí)現(xiàn)回調(diào)機(jī)制 
    private delegate void WriteTextBox(char ch); 
    private WriteTextBox writeTextBox; 
     //Text1的回調(diào) 
    private delegate void WriteBoxCallback1(char ch); 
    private WriteBoxCallback1 writeBoxCallback1; 
    //Text2的回調(diào) 
    private delegate void WriteBoxCallback2(char ch); 
    private WriteBoxCallback2 writeBoxCallbacK2; 
    private void button1_Click(object sender, EventArgs e) 
    { 
      if (checkBox1.Checked) 
      { 
        groupBox4.Text = "正在運(yùn)行。。。"; 
        groupBox4.Refresh(); 
        textBox1.Clear(); 
        textBox1.Refresh(); 
        Thread th1 = new Thread(new ThreadStart(dowrite1));//創(chuàng)建線程1 
        th1.Start();//啟動(dòng)線程1 
      } 
      if (checkBox2.Checked) 
      { 
        groupBox2.Refresh(); 
        groupBox5.Text = "正在運(yùn)行。。。"; 
        groupBox5.Refresh(); 
        textBox2.Clear(); 
        textBox2.Refresh(); 
        Thread th2 = new Thread(new ThreadStart(dowrite2));//創(chuàng)建線程2 
        th2.Start();//啟動(dòng)線程2 
      } 
    } 
    //Text1使用回調(diào)語句 
    private void CallTex1(char ch) 
    { 
      textBox1.Invoke(writeBoxCallback1,ch); 
    } 
    //Text2使用回調(diào)語句 
    private void CallText2(char ch) 
    { 
      textBox2.Invoke(writeBoxCallbacK2,ch); 
    } 
    //使用委托 
    private void WriteTex(WriteTextBox write) 
    { 
      string str = textBox3.Text.Trim(); 
      for (int i = 0; i < str.Length; i++) 
      { 
        write(str[i]); 
        DateTime now = DateTime.Now; 
        while (now.AddSeconds(1) > DateTime.Now) { } 
      } 
    } 
    //Text1添加值 
    private void Write1(char ch) 
    { 
      textBox1.AppendText(ch+"\r"); 
    } 
    //Text2添加值 
    private void Write2(char ch) 
    { 
      textBox2.AppendText(ch+"\r"); 
    } 
    //線程1調(diào)用的方法 
    private void dowrite1() 
    { 
      if (checkBox1.Checked) 
      { 
        writeTextBox = new WriteTextBox(CallTex1); 
        WriteTex(writeTextBox); 
      } 
    } 
    //線程2調(diào)用的方法 
    private void dowrite2() 
    { 
      if (checkBox2.Checked) 
      { 
        writeTextBox = new WriteTextBox(CallText2); 
        WriteTex(writeTextBox); 
      } 
    } 
  } 
} 

相關(guān)文章

  • C#讀寫共享文件夾的方法

    C#讀寫共享文件夾的方法

    這篇文章主要為大家詳細(xì)介紹了C#讀寫共享文件夾的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • 使用C#編寫一個(gè)Web服務(wù)器

    使用C#編寫一個(gè)Web服務(wù)器

    在.NET世界中,C#是一種功能強(qiáng)大的編程語言,常被用于構(gòu)建各種類型的應(yīng)用程序,本文主要為大家介紹了如何使用C#編寫一個(gè)簡單的Web服務(wù)器,需要的可以參考下
    2024-03-03
  • 深入理解C♯ 7.0中的Tuple特性

    深入理解C♯ 7.0中的Tuple特性

    這篇文章主要介紹了C#7中Tuple特性的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),相信對大家具有一定的參考價(jià)值,需要的朋友可以們下面來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-03-03
  • 運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource

    運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource

    這篇文章運(yùn)用示例簡單講解C#取消令牌CancellationTokenSource,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C#如何修改項(xiàng)目名圖文詳解

    C#如何修改項(xiàng)目名圖文詳解

    最近開發(fā)工作接近尾聲,客戶來要求更換項(xiàng)目的名稱,差不多要變更整個(gè)解決方案中項(xiàng)目名稱,引用等等,這個(gè)工作量還是很大的,這篇文章主要給大家介紹了關(guān)于C#如何修改項(xiàng)目名的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 從C#程序中調(diào)用非受管DLLs的方法

    從C#程序中調(diào)用非受管DLLs的方法

    這篇文章主要介紹了從C#程序中調(diào)用非受管DLLs的方法,是非常實(shí)用的技巧,有助于深入理解Windows程序設(shè)計(jì),需要的朋友可以參考下
    2014-10-10
  • C#創(chuàng)建自定義控件的示例

    C#創(chuàng)建自定義控件的示例

    這篇文章主要介紹了C#創(chuàng)建自定義控件的示例,幫助大家更好的理解和學(xué)習(xí)c#,感興趣的朋友可以了解下
    2020-10-10
  • C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法

    C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法

    本文主要介紹了C#使用Datatable導(dǎo)入sqlserver數(shù)據(jù)庫的三種方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-08-08
  • DevExpress實(shí)現(xiàn)GridControl顯示Gif動(dòng)畫的方法

    DevExpress實(shí)現(xiàn)GridControl顯示Gif動(dòng)畫的方法

    這篇文章主要介紹了DevExpress實(shí)現(xiàn)GridControl顯示Gif動(dòng)畫的方法,這是比較實(shí)用的方法,需要的朋友可以參考下
    2014-08-08
  • C#的winform控件命名規(guī)范

    C#的winform控件命名規(guī)范

    這篇文章主要介紹了C#的winform控件命名規(guī)范,對各種常用控件的命名規(guī)范做了較為詳細(xì)的講解,需要的朋友可以參考下
    2015-01-01

最新評論