什么是回调,如何在C#中实现?
什么是回调,如何在C#中实现?
Answers:
我刚遇到你,
这太疯狂了,
但这是我的电话(委托),
所以,如果发生(事件),请
打电话给我,也许(回叫)?
回调是一个过程在完成特定任务后将被调用的函数。
回调的用法通常在异步逻辑中。
要在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
链接
如果您指的是ASP.Net回调:
在ASP.NET网页的默认模型中,用户与页面进行交互并单击按钮或执行某些其他操作导致回发。重新创建页面及其控件,页面代码在服务器上运行,并将新版本的页面呈现给浏览器。但是,在某些情况下,从客户端运行服务器代码而不执行回发很有用。如果页面中的客户端脚本正在维护某些状态信息(例如,局部变量值),则发布页面并获取其新副本将破坏该状态。此外,页面回发会导致处理开销,从而降低性能并迫使用户等待页面被处理和重新创建。
为了避免丢失客户端状态并且不招致服务器往返的处理开销,可以对ASP.NET网页进行编码,以便它可以执行客户端回调。在客户端回调中,客户端脚本功能将请求发送到ASP.NET网页。该网页运行其正常生命周期的修改版本。将启动该页面,并创建其控件和其他成员,然后调用一个特殊标记的方法。该方法执行您已经编码的处理,然后将值返回给浏览器,该值可以被另一个客户端脚本功能读取。在整个过程中,页面在浏览器中处于活动状态。
来源:http://msdn.microsoft.com/en-us/library/ms178208.aspx
如果您在代码中引用回调:
回调通常是特定方法完成或执行子操作时调用的方法的委托。您通常会在异步操作中找到它们。这是一种编程原理,几乎可以在每种编码语言中找到。
此处的更多信息:http : //msdn.microsoft.com/zh-cn/library/ms173172.aspx
致力于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
方法将被调用。基本上,我们将委托传递给回调方法。
请让我知道,如果你有任何问题。
回调工作步骤:
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单击调用javascript函数,例如: builpopup(p1,p2,p3...)
var finalfield = p1,p2,p3;
UseCallBack(finalfield, "");
使用UseCallBack从客户端传递到服务器端的数据
2) public void RaiseCallbackEvent(string eventArgument)
在eventArgument中,我们获取传递的数据//做一些服务器端操作并传递给“ callbackResult”
3) GetCallbackResult()
//使用此方法将数据传递到客户端(ReceiveServerData()函数)端
callbackResult
4)在客户端获取数据:
ReceiveServerData(text)
在文本服务器响应中,我们将获取。
委托的作用与C ++中基于接口的回调相同(COM使用这些回调),尽管使用起来更简单。
请注意,Microsoft将委托放入其Java实现(J ++)中,但是Sun不喜欢它们[java.sun.com],因此不要指望很快就会在Java的正式版本中看到它们。我已经整理好了一个预处理器,让您可以在C ++中使用它们,因此,如果您不是在C#或.NET平台上(即在Managed C ++或Visual Basic.NET中)编程,请不要感到被遗忘。
如果您习惯于使用C函数来编写指针,那么委托基本上就是一对变成一个指针的指针:
这意味着一个委托可以传递在程序中定位函数所需的所有信息,无论是静态方法还是与对象关联的函数。
您可以在C#中这样定义它们:
public delegate void FooCallbackType( int a, int b, int c );
当您要使用它们时,可以从要调用的函数中进行委托:
class CMyClass
{
public void FunctionToCall( int a, int b, int c )
{
// This is the callback
}
public void Foo()
{
FooCallbackType myDelegate = new FooCallbackType(
this.FunctionToCall );
// Now you can pass that to the function
// that needs to call you back.
}
}
如果要使委托指向静态方法,则它看起来是一样的:
class CMyClassWithStaticCallback
{
public static void StaticFunctionToCall( int a, int b, int c )
{
// This is the callback
}
public static void Foo()
{
FooCallbackType myDelegate = new FooCallbackType(
CMyClass.StaticFunctionToCall );
}
}
总而言之,它们的作用与C ++中基于接口的回调相同,但所带来的麻烦却少了一点,因为您不必担心命名函数或创建辅助对象的麻烦,并且可以使委托使用任何方法。它们更加灵活。