什么是回调?
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 语义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));
【讨论】:
【参考方案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) 进行回调的经典示例。以上是关于什么是回调?的主要内容,如果未能解决你的问题,请参考以下文章