什么是回调?

问题描述 投票:113回答:10

什么是回调以及如何在C#中实现?

c# callback
10个回答
104
投票

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

-Wikipedia: Callback (computer science)

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


0
投票

回调工作步骤:

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调用Onclientclick为EX调用javascript函数: - qazxsw poi

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

2)UseCallBack(finalfield, "");在eventArgument中我们得到传递的数据//做一些服务器端操作并传递给“callbackResult”

3)public void RaiseCallbackEvent(string eventArgument) //使用此方法将数据传递给客户端(ReceiveServerData()函数)

callbackResult

4)在客户端获取数据:qazxsw poi,在文本服务器响应中,我们将得到。


928
投票

我刚认识你, 这很疯狂, 但这是我的号码(代表), 所以如果事情发生(事件), 打电话给我,也许(回调)?


66
投票

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

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

要在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));
    }

45
投票

Definition

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

Implementation

// 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();
    }
}

Usage

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

链接


10
投票

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

查看this链接。


7
投票

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

在ASP.NET网页的默认模型中,用户与页面交互并单击按钮或执行一些导致回发的其他操作。重新创建页面及其控件,页面代码在服务器上运行,并将新版本的页面呈现给浏览器。但是,在某些情况下,从客户端运行服务器代码而不执行回发非常有用。如果页面中的客户端脚本正在维护某些状态信息(例如,本地变量值),则发布页面并获取它的新副本会破坏该状态。此外,页面回发会引入处理开销,这会降低性能并迫使用户等待页面被处理和重新创建。

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

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

如果你在代码中引用回调:

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

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


4
投票
Dedication to LightStriker:  
Sample Code:
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();
    }       
}

Code Explanation:
I created the code to implement the funny explanation provided by    
LightStriker in the above one of the replies. We are passing 
delegate (number)   to a method (MetYourCrush). If the Interested
(event) occurs in the method (MetYourCrush) then it will call
the delegate (number) which was holding the reference of
CallMeBack method. So, the CallMeBack method will be called. 
Basically, we are passing delegate to call the callback method. 
Please let me know if you have any questions.

1
投票

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

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

C#,而不是使用术语'回调'使用'事件'和'委托',你可以找到更多关于代表here


0
投票

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

一些用途包括错误信令和控制功能是否起作用。

Wikipedia

© www.soinside.com 2019 - 2024. All rights reserved.