2016-03-08 95 views
-1

考虑一个方法foo()声明为返回任务对象对于返回任务的过程,什么意思是什么都不返回?

public async Task Foo() 
{ 
    try 
    { 
     // some preliminary code that can throw exceptions 
    } 
    catch (Exception e) 
    { 
     // do something about the error but we do not want 
     // to propogate it up. 
     return; 
    } 
    await SomeOtherMethodThatReturnsTask(); 
} 

C#编译器不会抱怨可言,即使它不返回“任务”对象赤裸“回归”。为什么允许?这里发生了什么? C#制作一个Task对象来返回这里吗?

回答

3

方法签名中的async关键字将您的方法的编译更改为一种状态机,使其返回一个Task,当您的方法代码完成时,该方法会完成。该关键字的存在意味着你的方法的代码被转换成更复杂的编译代码。

如果您完全熟悉yield return关键字,这是一个相似的原理。

1

是的,对于async方法编译器自动生成Task的结果。没有办法从async方法手动返回Task

请注意,您的样品中,如果“初步码”不具有await你不需要标记方法async并且可以返回自己的任务:

public Task Foo() 
{ 

    // some synchronous code (no await) 
    ... 
    if (someCondition) 
    { 
     return Task.FromResult(0); 
    } 
    return SomeOtherMethodThatReturnsTask(); 
} 
0

您使用的任务,如果没有任何意义,返回时该方法就完成了。也就是说,对该方法的调用返回一个Task,但是当Task完成时,任何等待该Task的await表达式都将失效。

async (C# Reference)