如何在匿名委托中调用异步方法?

n17*_*911 5 c# async-await

我有一个函数接受委托作为输入参数.

public delegate bool Callback();

public static class MyAPI
{
     public static handle(Callback callback) {
           ... 
     }
}
Run Code Online (Sandbox Code Playgroud)

所以我用这样的匿名代表调用api

MyAPI.handle(delegate
{
    // my implementation
});
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在匿名委托中调用异步方法?

MyAPI.handle(delegate
{
    // my implementation
    await MyMethodAsync(...);
});
Run Code Online (Sandbox Code Playgroud)

我得到一个错误,说'await'运算符只能在异步匿名方法中使用'?

函数MyAPI.handle()只期望非异步委托.我不能改变那种方法.我该如何解决我的问题?

谢谢.

Chr*_*tos 8

您可以调用异步方法,传递异步lambda表达式:

MyAPI.handle(async () =>
{
    // my implementation
    await MyMethodAsync(...);
});
Run Code Online (Sandbox Code Playgroud)

  • 虽然您可以将“async”与 lambda 表达式一起使用,但您也可以将它们与匿名方法一起使用(使用“async delegate”)。在 OP 的场景中,两者都会生成编译器错误,因为委托类型 Callback 不会返回 void、Task 或 Task<T>。 (2认同)
  • @KING我想我会是一个迂腐的人,并正式地说规范将*匿名函数*定义为内联方法声明的总称。匿名函数有两种形式:*匿名方法*和*lambda 表达式*。引用规范:“由于历史原因,匿名函数有两种语法风格,即 lambda 表达式和匿名方法表达式。对于几乎所有目的,lambda 表达式都比匿名方法表达式更简洁和更具表现力,后者保留该语言以实现向后兼容性。”。 (2认同)
  • @KING如果您仔细阅读规范,您会发现它对这种用法非常谨慎,并且它仅使用“匿名方法”来引用委托形式,但是在随意的对话中它们可以互换使用。 (2认同)