2025-05-12 05:00:00

什么是回调?

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


当前回答

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

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

要在c#中创建回调,需要在变量中存储函数地址。这是使用委托或新的lambda语义Func或Action实现的。

    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));
        DoWork(Console.WriteLine); // This also works
    }

其他回答

我才刚认识你, 这很疯狂, 这是我的number (delegate) 所以如果发生了什么(事件), 打给我吧(回电话)?

回调工作步骤:

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调用在客户端点击调用javascript函数为EX:- builpopup(p1,p2,p3…)

Var finalfield= p1,p2,p3; UseCallBack (finalfield”、“);使用UseCallBack将客户端的数据传递给服务器端

在eventArgument中我们获取传递的数据 //执行一些服务器端操作并传递给"callbackResult"

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

callbackResult

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

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

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

要在c#中创建回调,需要在变量中存储函数地址。这是使用委托或新的lambda语义Func或Action实现的。

    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));
        DoWork(Console.WriteLine); // This also works
    }

回调是作为参数传递给另一个函数的函数。这种技术允许函数调用形参函数实参,甚至将值传递回调用方。回调函数可以设计为在函数结束之前/之后运行,并且可以传递一个值。

它是一种构造,你调用一个长时间运行的函数,并要求他在它完成后回调你,可以返回一个参数结果给调用者。

这就像有人在你工作的时候打电话给你询问状态,你说“你知道吗,给我5分钟,我会给你回电”,最后你打电话给他更新情况。如果你是一个函数,调用者只是添加并传递了另一个你在最后调用的函数。这可以简单地用c#编写为:

public void VinodSrivastav(Action statusUpdate){
    //i am still here working..working

    //i have finished, calling you
    statusUpdate();
}

//invokes
stackoverflow.VinodSrivastav((cam) => { 
    Console.Write("Is it finished"); 
});

一个简单的例子是迭代器函数,其中的return将是多次,可以认为我们为它设置了yield:

public void IntreationLoop(int min, int max,Action<int> Callback)
{
    for(int i = min;i<= max;i++)
        Callback(i);
}

//call
IntreationLoop(5,50,(x) => { Console.Write(x); }); //will print 5-50 numbers

在上面的代码中,函数返回类型为void,但它有一个Action<int>回调函数,该回调函数被调用,并将循环中的每个项发送给调用者。

同样的事情也可以用if..else或try..catch block as:

public void TryCatch(Action tryFor,Action catchIt)
{
    try{
        tryFor();
    }
    catch(Exception ex)
    {
        Console.WriteLine($"[{ex.HResult}] {ex.Message}");
        catchIt();
    }
}

称之为:

TryCatch(()=>{ 
        int r = 44;
        Console.WriteLine("Throwing Exception");
        throw new Exception("something is wrong here");
    }, ()=>{
        Console.WriteLine("It was a mistake, will not try again");
    });

在2022年,我们有Func和Action做同样的事情,请参阅下面的演示代码,其中展示了如何使用它:

void Main()
{
    var demo = new CallbackDemo();
    demo.DoWork(()=> { Console.WriteLine("I have finished the work"); });
    demo.DoWork((r)=> { Console.WriteLine($"I have finished the work here is the result {r}"); });
    demo.DoWork(()=> { Console.WriteLine($"This is passed with func"); return 5;});
    demo.DoWork((f)=> { Console.WriteLine($"This is passed with func and result is {f}"); return 10;});
    
}

// Define other methods and classes here
public class CallbackDemo
{

    public void DoWork(Action actionNoParameter)
    {
        int a = 5;
        int b = 10;
        
        //i will do th maths and call you back
        int result = a + b;
        
        //callback
        actionNoParameter(); //execute
        Console.WriteLine($"[The Actual Result is {result}]");
    }
    
    public void DoWork(Action<int> actionWithParameter)
    {
        int a = 5;
        int b = 10;
        
        //i will do th maths and call you back
        int result = a + b;
        
        //callback
        actionWithParameter(result); //execute
        Console.WriteLine($"[The Actual Result is {result}]");
    }
    
    public void DoWork(Func<int> funcWithReturn)
    {
        int a = 5;
        int b = 10;
        
        //i will do th maths and call you back
        int result = a + b;
        
        //callback
        int c = funcWithReturn(); //execute
        
        result += c;
        Console.WriteLine($"[The Actual Result is {result}]");
    }
    
    public void DoWork(Func<int,int> funcWithParameter)
    {
        int a = 5;
        int b = 10;
        
        //i will do th maths and call you back
        int result = a + b;
        
        //callback
        result += funcWithParameter(result); //execute
        Console.WriteLine($"[The Actual Result is {result}]");
    }
}

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

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

c#使用“事件”和“委托”而不是“回调”这个术语,你可以在这里找到更多关于委托的信息。