2013-10-29 89 views
1

這段代碼實際上做了什麼?「異步任務」成員問題

public async Task Foo() 
{ 
} 

你得到的是,由於Fooawait,將同步運行的警告。這完全等於public void Foo()嗎?爲什麼它有效返回Task,但實際上不創建並返回一個?

同樣,下面做了什麼?

public async Task Foo() 
{ 
    await SomeOtherAsyncFn(); 
} 

回答

8

當你寫public async Task Foo() {},編譯器實際經歷和無狀態的,後者立即返回Task創建一個狀態機。有很多額外的開銷沒有任何用處,這就是爲什麼有一個編譯器警告,以避免這種情況。

這將是簡單得多/更高效的只是寫:

public Task Foo() 
{ 
    return Task.FromResult(true); 
} 

這將提供相同的API,以更簡單的方式。

同樣,下面做了什麼?

public async Task Foo() 
{ 
    await SomeOtherAsyncFn(); 
} 

這將導致編譯器創建一個狀態機將返回一個Task。當您致電Foo()時,它會立即致電SomeOtherAsyncFn。返回的Task將在SomeOtherAsyncFn()完成後立即標記爲已完成。在這種情況下,狀態機還會處理乾淨地爲您冒泡的異常,所以如果發生在SomeOtherAsyncFn()中,異常將正確映射到Task

+0

當然,對於第二個例子,您也可以直接編寫'return SomeOtherAsyncFn();'並且讓方法*不是'async'來避免狀態機及其伴隨的所有開銷。 – Servy

+0

謝謝!那麼這是否意味着'異步任務Foo(){/ *某些非等待工作在這裏* /}'在功能上*和'void Foo(){/ *在這裏有一些非等待工作* /}'相同? – moswald

+1

@moswald是的 - 雖然它返回一個「完成」的任務,並且經過很多工作才能到達那裏。 –