什么是回调?

Posted

技术标签:

【中文标题】什么是回调?【英文标题】:What is a callback? 【发布时间】:2011-01-09 12:50:49 【问题描述】:

什么是回调,它是如何在 C# 中实现的?

【问题讨论】:

你指的是ASP.Net回调还是委托回调参数? 这可能意味着很多事情——你在什么情况下听说过它? 我认为他在谈论异步。回调 -1 问题不清楚(不够详细)。 如果您正在寻找 AsyncCallBack,请看这里:***.com/questions/1047662/what-is-asynccallback 【参考方案1】:

致力于 LightStriker: 示例代码:

class CallBackExample

    public delegate void MyNumber();
    public static void CallMeBack()
    
        Console.WriteLine("He/She is calling you.  Pick your phone!:)");
        Console.Read();
    
    public static void MetYourCrush(MyNumber number)
    
        int j;
        Console.WriteLine("is she/he interested 0/1?:");
        var i = Console.ReadLine();
        if (int.TryParse(i, out j))
        
            var interested = (j == 0) ? false : true;
            if (interested)//event
            
                //call his/her number
                number();
            
            else
            
                Console.WriteLine("Nothing happened! :(");
                Console.Read();
            
        
    
    static void Main(string[] args)
    
        MyNumber number = Program.CallMeBack;
        Console.WriteLine("You have just met your crush and given your number");
        MetYourCrush(number);
        Console.Read();
        Console.Read();
           

代码说明:

我创建了代码来实现 LightStriker 在上述回复之一中提供的有趣解释。我们将委托(数字)传递给方法(MetYourCrush)。如果感兴趣的(事件)发生在方法(MetYourCrush)中,那么它将调用持有CallMeBack 方法引用的委托(编号)。因此,CallMeBack 方法将被调用。基本上,我们通过委托来调用回调方法。

如果您有任何问题,请告诉我。

【讨论】:

这并不能充分回答问题,您能否解释一下您的代码在做什么,描述回调如何工作,以及它是如何在 C# 中实现的。 嗨,亚当,感谢您的回复。我创建了代码来实现 LightStriker 提供的有趣解释。我们将委托(数字)传递给方法(MetYourCrush)。如果Interested(事件)发生在方法(MetYourCrush)中,那么它将调用持有CallMeBack方法引用的委托(号码)。因此,将调用 CallMeBack 方法。基本上,我们通过委托来调用回调方法。如果您有任何问题,请告诉我。【参考方案2】:

在computer programming 中,回调是executable code,它作为argument 传递给其他代码。

—Wikipedia: Callback (computer science)

C# 有 delegates 用于此目的。它们与events 大量使用,因为事件可以自动调用许多附加的委托(事件处理程序)。

【讨论】:

实际上回调是一个指向可执行代码的指针,它作为参数传递给其他代码......页面需要审查 @G_G:没有什么说它必须是一个指针。这通常是因为数据段不可执行,但这在技术上是一个实现细节。 Joey:你说得对,这是一个实现细节,但即使是回调也是实现细节。您可以在没有使用单个回调的情况下重写您的代码。这就像'while' vs 'for'。【参考方案3】:

我刚认识你, 这太疯狂了, 但这是我的电话号码(代表), 因此,如果发生某些事情(事件), 给我打电话,也许(回拨)?

【讨论】:

非常酷的解释。每当有人问我都会使用这个解释,希望我能获得使用它的权利吗? +1:喜欢它。它毁了这首歌,但应该是“但这是我的电话号码和使用特定类型电话(代表)的说明” 带着微笑学习代表 :-) 有史以来最好的解释! 请注意,用这种解释向其他人教授代表只有在编排好的情况下才有效 :)【参考方案4】:

回调是在进程完成执行特定任务时将调用的函数。

回调的使用通常在异步逻辑中。

要在 C# 中创建回调,您需要将函数地址存储在变量中。这是使用delegate 或新的lambda 语义FuncAction 实现的。

    public delegate void WorkCompletedCallBack(string result);

    public void DoWork(WorkCompletedCallBack callback)
    
        callback("Hello world");
    

    public void Test()
    
        WorkCompletedCallBack callback = TestCallBack; // Notice that I am referencing a method without its parameter
        DoWork(callback);
    

    public void TestCallBack(string result)
    
        Console.WriteLine(result);
    

在今天的 C# 中,这可以使用 lambda 来完成,例如:

    public void DoWork(Action<string> callback)
    
        callback("Hello world");
    

    public void Test()
    
        DoWork((result) => Console.WriteLine(result));
    

【讨论】:

【参考方案5】:

定义

回调是可执行代码 作为参数传递给其他代码。

实施

// Parent can Read
public class Parent

    public string Read() /*reads here*/ ;


// Child need Info
public class Child

    private string information;
    // declare a Delegate
    delegate string GetInfo();
    // use an instance of the declared Delegate
    public GetInfo GetMeInformation;

    public void ObtainInfo()
    
        // Child will use the Parent capabilities via the Delegate
        information = GetMeInformation();
    

用法

Parent Peter = new Parent();
Child Johny = new Child();

// Tell Johny from where to obtain info
Johny.GetMeInformation = Peter.Read;

Johny.ObtainInfo(); // here Johny 'asks' Peter to read

链接

more details 用于 C#。

【讨论】:

嗨@serhio 谢谢你的回答。对我来说仍然有点模糊:作为参数传递给其他代码的代码到底在哪里似乎是将 Peter.Read 方法添加到孩子的委托? @serhio 链接已失效。【参考方案6】:

回调工作步骤:

1) 我们必须实现ICallbackEventHandler 接口

2) 注册客户端脚本:

 String cbReference = Page.ClientScript.GetCallbackEventReference(this, "arg", "ReceiveServerData", "context");
    String callbackScript = "function UseCallBack(arg, context)" + " " + cbReference + ";";
    Page.ClientScript.RegisterClientScriptBlock(this.GetType(), "UseCallBack", callbackScript, true);

1) 从 UI 调用 Onclient 点击调用 EX 的 javascript 函数:- builpopup(p1,p2,p3...)

var finalfield= p1,p2,p3; UseCallBack(finalfield, ""); 来自客户端的数据通过 UseCallBack 传递到服务器端

2) public void RaiseCallbackEvent(string eventArgument) 在 eventArgument 我们得到传递的数据 //做一些服务器端操作并传递给“callbackResult”

3) GetCallbackResult() // 使用此方法数据将被传递到客户端(ReceiveServerData() 函数)端

回调结果

4) 在客户端获取数据: ReceiveServerData(text),在文本服务器响应中,我们会得到。

【讨论】:

【参考方案7】:

如果您指的是 ASP.Net 回调:

在 ASP.NET Web 的默认模型中 页面,用户与页面交互 并单击一个按钮或执行一些 导致 回发。页面及其控件 重新创建,页面代码运行 服务器和新版本的 页面呈现给浏览器。 但是,在某些情况下,它是 从运行服务器代码很有用 客户端不执行回发。 如果页面中的客户端脚本是 维护一些状态信息 (例如,局部变量值), 发布页面并获得新的 它的副本会破坏该状态。 此外,页面回发引入 可以减少的处理开销 性能并强制用户等待 要处理的页面和 重新创建。

为了避免丢失客户端状态而不是 产生的处理开销 服务器往返,您可以编写一个 ASP.NET 网页,使其可以 执行客户端回调。在一个客户端 回调,客户端脚本函数 向 ASP.NET Web 发送请求 页。网页运行修改后的 其正常生命周期的版本。这 页面被启动,它的控件和 创建其他成员,然后 调用特殊标记的方法。 该方法执行处理 你已经编码然后返回一个 可以读取的浏览器的值 由另一个客户端脚本函数。 在整个过程中,页面是 存在于浏览器中。

来源:http://msdn.microsoft.com/en-us/library/ms178208.aspx

如果您指的是代码中的回调:

回调通常是在特定操作完成或执行子操作时调用的方法的委托。您经常会在异步操作中找到它们。这是几乎在所有编码语言中都可以找到的编程原则。

更多信息在这里:http://msdn.microsoft.com/en-us/library/ms173172.aspx

【讨论】:

【参考方案8】:

可能不是字典定义,但回调通常是指一个函数,该函数位于特定对象的外部,被存储然后在特定事件上调用。

一个示例可能是在创建 UI 按钮时,它存储对执行操作的函数的引用。该操作由代码的不同部分处理,但是当按下按钮时,会调用回调并调用要执行的操作。

C#,而不是使用术语“回调”使用“事件”和“委托”,您可以找到更多关于委托here。

【讨论】:

【参考方案9】:

回调允许您将可执行代码作为参数传递给其他代码。在 C 和 C++ 中,这被实现为函数指针。在 .NET 中,您将使用委托来管理函数指针。

一些用途包括错误信号和控制函数是否起作用。

Wikipedia

【讨论】:

【参考方案10】:

回调是您传递给另一个函数的函数指针。您正在调用的函数将在完成后“回调”(执行)另一个函数。

查看this 链接。

【讨论】:

回调可以实现为方法的委托,但您同样可以说在其接口上传递支持回调方法的对象是回调。 Array.Sort(arrayObject);在 arrayObject 的元素上调用 obj.CompareTo(anotherObj) 是 .Net 中使用接口 (ICompareable) 进行回调的经典示例。

以上是关于什么是回调?的主要内容,如果未能解决你的问题,请参考以下文章

什么是回调函数

请问啥叫回调方法?

什么是回调函数?回调函数适合在什么情况下使用?

什么是事件回调?

什么是回调函数

PHP回调函数到底是个什么