我開始使用C#編寫代碼,並且從來沒有機會使用回調函數,儘管我使用委託進行事件接線。什麼是回調的真正應用。如果您可以提供一些鏈接,以簡單直接的方式解釋回調而無需C++先決條件,我將不勝感激。C#中的回調函數#
5
A
回答
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?
相關問題
- 1. C#中的回調函數
- 2. C++中的回調函數
- 3. C#中的回調函數#
- 4. C++回調函數
- 5. 在C#中返回php回調函數
- 6. C函數中的D回調
- 7. C++中的定時器回調函數
- 8. C++中的VC++ __stdcall回調函數#
- 9. C#MixerOpen與回調函數
- 10. C++回調類函數
- 11. 回調函數設計C++
- 12. C++多個回調函數
- 13. C++函數指針和回調函數
- 14. 在c庫的回調函數中調用C++對象
- 15. 在C++中分配回調函數
- 16. 使用C++類的成員函數爲C回調函數
- 17. NullReferenceException在C++回調C#函數期間
- 18. 在C#中調用C dll函數,結構體和回調函數
- 19. 在C++ DLL中調用Delphi中的回調函數
- 20. C++到vb.net,回調函數的問題
- 21. C++:具有狀態的回調函數
- 22. 成員函數的C++回調
- 23. Objective-C iOS之間的回調函數
- 24. 將delphi的C++回調函數導入
- 25. node.js中的回調函數
- 26. CodeIgniter中的回調函數
- 27. dojo.io.script.get中的回調函數
- 28. 回調函數中的AttributeError
- 29. java中的回調函數
- 30. nextAll()中的回調函數
我的答案在下面有幫助嗎?如果是這樣,請將其標記爲答案。謝謝。 – gehho 2010-04-14 06:24:45
嗨丹尼爾,你能選擇一個答案並將其標記爲答案。 – 2010-04-14 13:52:06