2015-11-06 51 views
4

我有一个函数需要一个委托作为输入参数。如何在匿名代理中调用异步方法?

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

你不能......如果你弄清楚你是否需要该方法或只是结果,发射后不管人们可以找到很好的重复,显示适当的肮脏黑客。 –

回答

8

你可以称之为一个异步方法,通过异步lambda表达式:

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

虽然您可以对lambda表达式使用'async',但您也可以将它们与匿名方法一起使用(使用'async delegate')。在OP的情况下,由于委托类型Callback不会返回void,Task或任务,所以会产生编译器错误。 –

+0

@mikez听起来不像那个Guy,但在你的评论中你提到了lambda表达式和匿名方法,就好像有两个不同的实体一样。实际上,lambda表达式是一种匿名方法。我想你的意思是说,你可以通过lamda表达式使用匿名方法,也可以使用委托。 – KING

+1

@KING我想我会是一个迂腐的人,并且正式说这个规范定义了*匿名函数*作为内联方法声明的总称。匿名函数可以有两种形式,*匿名方法*和* lambda表达式*。引用规范:“由于历史原因,匿名函数有两种语法风格,即lambda表达式和匿名方法表达式。几乎所有用途中,lambda表达式都比匿名方法表达式更加简洁和表达,留在用于向后兼容的语言中。“ –

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