2011-12-14 83 views
32

我最近已经从Objective-C领域转移回C#,并且C#5中的async/await关键字看起来很酷。但我仍然试图理解正确的语法。传递异步委托的方法签名是什么?

我想声明一个将异步委托作为参数的方法,但是我无法正确调用调用者和被调用者的语法。有人可以提供一个代码示例,显示方法声明,调用以及对委托的调用吗?

我在想这个声明会像下面这样。请注意,此功能不是异步的;即其异步性与代表无关。

void DoSomethingWithCallback(async delegate foo(int)) 
{ 
    ... 
    foo(42); 
    ... 
} 

呼叫会是这样的:

DoSomethingWithCallback(async (int x) => { this.SomeProperty = await SomeAsync(x); }); 

当然这一切都不中编译和大多数我见过假设一个具有字段或属性是这样的代表,而不是样品我想使用的匿名代理。

+0

尽我所知,没有办法指定内联代理,就像我在上面的问题中所做的那样。要使用委托作为方法参数,委托类型需要在类作用域之外声明。 – AndrewS 2011-12-15 17:13:34

回答

47

将委托作为参数的函数必须使用指定的委托类型;与Objective-C不同的是,您不能在函数定义中内联声明匿名委托类型。但是,提供了仿制药动作<>和Func <>,因此您无需自行申报新的类型。在下面的代码中,我假设代表采用单个int作为参数。

void DoSomethingWithCallback(Func<int,Task> callbackDelegate) 
{ 
    Task t = callbackDelegate(42); 
} 

如果这个功能不实际上做任何与任务对象返回(如上面所示的代码),您可以改用Action<int>作为委托类型。如果使用Action,则仍然可以声明委托异步(见下文),但隐式返回的Task对象将被忽略。

调用上述函数的lambda语法非常简单,您在问题中使用的语法是正确的。需要注意的是参数类型不需要在这里指定,因为它可以推断出:

DoSomethingWithCallback(async (intParam) => { this.myint = await Int2IntAsync(intParam); }); 

您还可以通过一种方法或委托变量,如果你愿意的话,而不是使用lambda语法:

async Task MyInt2Int(int p) { ... } 
Func<int,Task> myDelegate; 
void OtherMethod() 
{ 
    myDelegate = MyInt2Int; 
    DoSomethingWithCallback(myDelegate); // this ... 
    DoSomethingWithCallback(MyInt2Int); // ... or this. 
} 
5

如果没有返回类型,则方法签名的返回类型为Task;如果有返回类型,则返回Task<T>

Th,如果您可以拥有这样的异步lambdas,我不是100%确定的。

在消耗任务的方法中,您将“等待”任务或使用Task上的属性和方法来获取结果。

+10

是的,我们支持异步lambdas。如果我自己这样说,那就太漂亮了。 – 2011-12-14 21:04:09