C#中的回调

我希望有一个库中有一个函数,它接受一个对象的参数。

使用此对象,我希望能够在X完成时调用指定的函数。 将被调用的函数由调用者指定,并且X将由库完成并监视。

我怎样才能做到这一点?

作为参考,我使用的是C#和.NET 3.5

提供委托并使用匿名委托或Lambda表达式

public static void DoWork(Action processAction) { // do work if (processAction != null) processAction(); } public static void Main() { // using anonymous delegate DoWork(delegate() { Console.WriteLine("Completed"); }); // using Lambda DoWork(() => Console.WriteLine("Completed")); } 

或者使用界面

 public interface IObjectWithX { void X(); } public class MyObjectWithX : IObjectWithX { public void X() { // do something } } public class ActionClass { public static void DoWork(IObjectWithX handlerObject) { // do work handlerObject.X(); } } public static void Main() { var obj = new MyObjectWithX() ActionClass.DoWork(obj); } 

听起来像代表的完美配方 – 特别是,与委托的回调正是如何在.NET中的异步模式中处理它。

调用者通常会传递一些状态和一个委托,并将它们存储在你所拥有的任何上下文中,然后调用委托者传递状态和你可能拥有的任何结果。

您可以使状态只是object也可以使用generics委托并获取适当类型的状态,例如

 public delegate void Callback(T state, OperationResult result) 

然后:

 public void DoSomeOperation(int otherParameterForWhateverReason, Callback callback, T state) 

当您使用.NET 3.5时,您可能希望使用现有的Func<...>Action<...>委托类型,但您可能会发现它更清楚地声明您自己的。 (该名称可能会使您更清楚地使用它。)

有问题的对象需要实现您提供的接口。 将接口作为参数,然后您可以调用接口公开的任何方法。 否则你无法知道对象的能力。 那,或者您可以将委托作为参数并调用它。

是否有理由不让您的图书馆在操作完成时提供公开事件? 然后调用者可以注册以处理事件,您不必担心传递对象或委托。

实现您提供的接口的对象可以工作,但它似乎更像是Java方法而不是.NET方法。 事件似乎对我来说有点清洁。

您可以使用C#.NET中提供的System.Action作为回调函数。 请查看此示例示例:

  //Say you are calling some FUNC1 that has the tight while loop and you need to //get updates on what percentage the updates have been done. private void ExecuteUpdates() { Func1(Info => { lblUpdInfo.Text = Info; }); } //Now Func1 would keep calling back the Action specified in the argument //This System.Action can be returned for any type by passing the Type as the template. //This example is returning string. private void Func1(System.Action UpdateInfo) { int nCount = 0; while (nCount < 100) { nCount++; if (UpdateInfo != null) UpdateInfo("Counter: " + nCount.ToString()); //System.Threading.Thread.Sleep(1000); } }