C#中的回调

时间:2010-04-13 10:05:31

标签: c# delegates callback

我开始使用C#进行编码,虽然我已使用委托进行事件连接,但我从未有机会使用回调。回调的真正应用是什么。如果你能提供一些在没有C ++先决条件的情况下直接解释回调的链接,我将不胜感激。

6 个答案:

答案 0 :(得分:9)

回调实际上是一个委托,即对函数的引用。回调通常用于异步(多线程)场景,以在异步操作完成时通知调用者:异步方法将回调/委托作为参数获取,并在完成其工作后调用此委托,即 “回电”。使用回调/委托使调用者能够决定调用哪个操作,因为他传入了参数。

示例:
当用户通过单击按钮启动长时间运行操作时,可以将鼠标指针设置为WaitCursor并在另一个线程上启动长时间运行操作。现在,您如何知道何时可以将鼠标指针重置为普通的ArrowCursor?答:使用回调。您只需创建一个方法,将光标重置为箭头,然后将此方法(委托)的引用作为回调参数传递。然后在操作完成时调用此方法,并重置光标。

实际上,事件也是某种回调:您注册一个代理,以便在发生特定事件时收到通知。发生此事件时,您使用提供的代理回调

答案 1 :(得分:1)

任何异步操作都依赖于回调。

答案 2 :(得分:1)

回调是委托是一个函数指针。我不认为线程是回调的先决条件。

答案 3 :(得分:1)

如果您熟悉WPF,一个很好的例子是Dependency Properties。然后使用DependencyProperty.Register注册:

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

作为最后一个参数,当需要完成某些工作(验证值)时,您会传递一个由框架 的函数

答案 4 :(得分:0)

它们用于捕获异步操作的结果。

答案 5 :(得分:0)

Delegate持有对方法的引用,使其成为回调的理想候选者。

我试图用一个简单的例子来解释它: 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?