C#中的回调

Mal*_*ist 16 .net c# callback

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

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

我怎样才能做到这一点?

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

ben*_*wey 40

提供委托并使用匿名委托或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"));
}
Run Code Online (Sandbox Code Playgroud)

或者使用界面

public static void DoWork(Action<string> processAction)
{
  // do work
  if (processAction != null)
    processAction("this is the string");
}

public static void Main()
{
  // using anonymous delegate
  DoWork(delegate(string str) { Console.WriteLine(str); });

  // using Lambda
  DoWork((str) => Console.WriteLine(str));
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*eet 6

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

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

您可以使状态正好object或可能使用泛型委托并采用适当类型的状态,例如

public delegate void Callback<T>(T state, OperationResult result)
Run Code Online (Sandbox Code Playgroud)

然后:

public void DoSomeOperation(int otherParameterForWhateverReason,
                            Callback<T> callback, T state)
Run Code Online (Sandbox Code Playgroud)

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

  • 我建议你仔细阅读代表(以及可能的泛型).我关于代表和证据的文章位于http://pobox.com/~skeet/csharp/events.html (2认同)