2016-03-08 96 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)