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

6

我有一个函数,它以委托作为输入参数。

public delegate bool Callback();

public static class MyAPI
{
     public static handle(Callback callback) {
           ... 
     }
}

我使用匿名委托来调用API,就像这样

MyAPI.handle(delegate
{
    // my implementation
});

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

MyAPI.handle(delegate
{
    // my implementation
    await MyMethodAsync(...);
});

我收到了一个错误信息,显示“await”操作符只能在异步匿名方法中使用?

函数MyAPI.handle()只接受非异步委托。我无法更改该方法。我该如何解决我的问题?

谢谢。


2
你不能...如果你澄清你是需要方法的结果还是仅仅需要一次性执行,就可以找到合适的重复代码,展示相应的不良技巧。 - Alexei Levenkov
3个回答

11

您可以通过传递一个异步 Lambda 表达式来调用异步方法:

MyAPI.handle(async () =>
{
    // my implementation
    await MyMethodAsync(...);
});

2
虽然您可以在lambda表达式中使用async,但也可以在匿名方法中使用它们(使用async delegate)。在OP的情况下,两者都会生成编译器错误,因为委托类型Callback不返回void、Task或Task<T>。 - Mike Zboray
@mikez,不想听起来像那个人,但是在你的评论中,你提到了lambda表达式和匿名方法,好像它们是两个不同的实体。而事实上,lambda表达式就是一个匿名方法。我认为你想说的是,你可以通过lambda表达式使用匿名方法,或者你可以使用委托。 - KING
2
@KING 我想我会成为一个吹毛求疵的人,并正式地说规范将“匿名函数”定义为内联方法声明的总称。匿名函数可以有两种形式,即“匿名方法”和“lambda表达式”。引用规范的话:“由于历史原因,匿名函数有两种语法风格,即lambda表达式和匿名方法表达式。对于几乎所有的目的,lambda表达式比匿名方法表达式更简洁、更具表现力,而匿名方法表达式仍然保留在语言中以实现向后兼容性。”。 - Mike Zboray
2
@KING 如果你仔细阅读规范,你会注意到它在使用上非常小心,并且仅使用“匿名方法”来引用委托表单,但是在日常交谈中它们可以互换使用。 - Mike Zboray

2
MyAPI.handle(async () =>
{
    // my implementation
    await MyMethodAsync(...);
});

0

对于像我这样不太喜欢Lambda表达式外观的人来说,另一个解决方案是...

MyAPI.handle(
    async delegate() {
        // my implementation
        await MyMethodAsync(...);
    }
);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接