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

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

【问题讨论】:

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

标签: c# callback


【解决方案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
    

    链接

    【讨论】:

    • 嗨@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) 进行回调的经典示例。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-10-23
            • 1970-01-01
            • 2011-01-05
            相关资源
            最近更新 更多