2010-04-13 65 views
5

我開始使用C#編寫代碼,並且從來沒有機會使用回調函數,儘管我使用委託進行事件接線。什麼是回調的真正應用。如果您可以提供一些鏈接,以簡單直接的方式解釋回調而無需C++先決條件,我將不勝感激。C#中的回調函數#

+0

我的答案在下面有幫助嗎?如果是這樣,請將其標記爲答案。謝謝。 – gehho 2010-04-14 06:24:45

+0

嗨丹尼爾,你能選擇一個答案並將其標記爲答案。 – 2010-04-14 13:52:06

回答

9

回調實際上是一個委託,即對函數的引用。回調通常用於異步(多線程)場景,以在異步操作完成時通知調用者:異步方法獲取回調/委託作爲參數,並在其完成工作後調用該委託,即它調用「調用回「。使用回調/委託使調用者可以決定調用哪個操作,因爲他傳遞了參數。

例子:
當用戶通過點擊一個按鈕,啓動一個長期運行的操作,你可以設置鼠標指針WaitCursor,並開始在另一個線程的長時間運行的操作。現在,您如何知道何時可以將鼠標指針重置爲正常的ArrowCursor?答:使用回調。您只需創建一個將光標重置爲箭頭的方法,然後將對此方法(委託)的引用作爲回調參數傳遞。然後在操作完成時調用此方法,並且您的光標被重置。

事實上,事件也是某種回調:你註冊了一個委託,當某個事件發生時被通知。當這個事件發生時,你使用提供的代表回撥

1

任何異步操作都將依賴於回調。

1

回調是一個委託是一個函數指針。我不認爲線程是回調的先決條件。

0

它們用於捕獲異步操作的結果。

1

如果您熟悉WPF,一個很好的例子是依賴屬性。你註冊,然後使用DependencyProperty.Register

public static DependencyProperty Register(
    string name, 
    Type propertyType, 
    Type ownerType, 
    PropertyMetadata typeMetadata, 
    ValidateValueCallback validateValueCallback 
) 

作爲最後一個參數,你傳遞一個函數來完成你的由框架當某些工作需要叫(驗證值)。

0

委託持有一個方法的引用,使其成爲回調的理想候選者。

我試圖用一個簡單的例子來解釋它: Meditor類就像一個控制器可以登錄的聊天服務器。爲了進行通信,控制器需要實現一個將作爲回調方法的方法。

public class Mediator 
    { 
     //instruct the robot to move. 
     public delegate void Callback(string sender, string receiver, Message msg); 


     Callback sendMessage; 

     //Assign the callback method to the delegate   
     public void SignOn(Callback moveMethod) 
     { 
      sendMessage += moveMethod; 
     } 

     public void SendMessage(string sender, string receiver, string msg) 
     { 
      sendMessage(sender, receiver, msg); 
     } 
    } 


public class Controller : Asset 
    { 
     string readonly _name; 
     Mediator _mediator; 
     public Controller(Mediator m, string name) 
     { 
       _name = name; 
      _mediator = m; 
      //assign the call back method 
      _mediator.SignOn(Notification); 
     } 

     public void Notification(string sender, string receiver, string msg) 
     { 
      if (receiver == _name) 
      { 
       Console.WriteLine("{0}: Message for {1} - {2}".FormateText(sender, 
       receiver, msg)); //I have create extension method for FormatText. 
      } 
     } 

     public void Mobilize(string receiver, string msg) 
     { 
       _mediator.SendMessage(_name, receiver, msg); 
     } 

    } 

static void Main(string[] args) 
{ 

    Mediator mediator; 
    mediator = new Mediator(); 

    //accept name here... 

    Controller controller1 = new Controller(mediator, "name1"); 
    Controller controller2 = new Controller(mediator, "name2"); 
    controller1.Mobilize("name2","Hello"); 
    controller1.Mobilize("name1", "How are you?"); 
} 

output will be: 

name1: Message for name2 - Hello 
name2: Message for name1 - How are you?