2014-03-13 38 views
0

我有两个异步方法如下:如何通过另一个返回异步任务?

protected async Task<bool> DoSomething(byte[] data) { 
    await System.Console.Out.WriteLineAsync("Do things."); 
    Data refinedData = Data.fromByteArray(data); 
    return DoSomething(refinedData); // Compiler error! 
} 

protected async Task<bool> DoSomething(Data data) { 
    /* Do way more interesting things with data now that it's our type! */ 
    return true; 
} 

我希望做的是没有使用await我的第一个return语句,而是仅仅通过给DoSomething第二个覆盖。有没有一种特殊的方法,我可以调用返回的第二个覆盖,以推迟生成的实例,或者我可以/应该使用的特定语言机制?

+0

我得到一个编译错误说,第一种方法必须返回'bool'不'任务'。 –

+1

从第一个方法签名中删除async关键字,你应该没问题。 –

+0

这是唯一的解决方案,还是有办法解决这个问题,而不会失去在这些覆盖类型中使用'await'的能力? –

回答

3

您应该从第一个方法签名中删除async关键字,或者您应该在返回之前使用await关键字。

return await DoSomething(refinedData);

+0

+1:确实 - 没有'await' inside =>不标记方法'async'并且简单地返回'任务';用'await'里面的标记'async'和'return await ...'。 –

+0

这是正确的方法;当OP想象这个方法是否是异步时,不可能'传递',因为表示'DoSomething(byte [])'异步方法调用的任务实际上是在方法的_first_ await中返回的,到应该设置为任务完成结果的最终返回值。 –

+2

警告:从第一个方法的签名中删除'async'会改变它的行为。具体来说,抛出的异常将不再被调用者期望的“任务”封装起来。 –