什么是回调以及如何在C#中实现?
在computer programming中,回调是executable code,它作为argument传递给其他代码。
回调工作步骤:
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,在文本服务器响应中,我们将得到。
我刚认识你, 这很疯狂, 但这是我的号码(代表), 所以如果事情发生(事件), 打电话给我,也许(回调)?
回调是在进程执行特定任务时将调用的函数。
回调的使用通常是异步逻辑。
要在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));
}
回调是可执行代码,作为参数传递给其他代码。
// 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
链接
回调是一个传递给另一个函数的函数指针。您正在调用的函数将在完成后“回调”(执行)另一个函数。
查看this链接。
如果您指的是ASP.Net回调:
在ASP.NET网页的默认模型中,用户与页面交互并单击按钮或执行一些导致回发的其他操作。重新创建页面及其控件,页面代码在服务器上运行,并将新版本的页面呈现给浏览器。但是,在某些情况下,从客户端运行服务器代码而不执行回发非常有用。如果页面中的客户端脚本正在维护某些状态信息(例如,本地变量值),则发布页面并获取它的新副本会破坏该状态。此外,页面回发会引入处理开销,这会降低性能并迫使用户等待页面被处理和重新创建。
为了避免丢失客户端状态而不会导致服务器往返的处理开销,您可以编写ASP.NET网页代码,以便它可以执行客户端回调。在客户端回调中,客户端脚本函数将请求发送到ASP.NET网页。网页运行其正常生命周期的修改版本。启动页面并创建其控件和其他成员,然后调用特殊标记的方法。该方法执行您已编码的处理,然后将值返回给浏览器,该值可由另一个客户端脚本函数读取。在整个过程中,页面在浏览器中处于活动状态。
资料来源:http://msdn.microsoft.com/en-us/library/ms178208.aspx
如果你在代码中引用回调:
回调通常是在特定操作完成或执行子操作时调用的方法的委托。您经常会在异步操作中找到它们。这是一种编程原则,几乎每种编码语言都可以找到它。
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.
可能不是字典定义,但回调通常是指一个特定对象外部的函数,存储然后在特定事件上调用。
一个示例可能是创建UI按钮时,它存储对执行操作的函数的引用。该操作由代码的不同部分处理,但是当按下该按钮时,将调用回调并调用要执行的操作。
C#,而不是使用术语'回调'使用'事件'和'委托',你可以找到更多关于代表here。