2015-06-13 174 views
-2

爲什麼B運行同步? Vs說:「因爲這個調用沒有被等待,所以在調用完成之前繼續執行當前的方法。」 ;函數運行同步時VS說它應該運行異步

A) Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async 

B) Funcation(1, 1); // Says it runs async in vs, but really runs sync. 
C) var handleOne = Task.Run(() => 
     { 
      Funcation(1, 1); 
     }); // Runs Async 
D) await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly 
E) await Funcation(1, 1); //awaits correctly 


static private async Task<int> Funcation(int x, int y) 
{ 
    Task.Delay(1000).Wait(); 
} 

回答

1

Funcation使用async關鍵字但在它的身上什麼也沒await所以它總是會同步運行。也Function甚至沒有編譯。

A)

Task.Factory.StartNew(() => Funcation(1, 1)); //Runs Async 

在這裏你創建一個線程,該線程調用Function所以它是asynchrounsly,因爲它是在另一個線程上運行。

B)

Funcation(1, 1); 

Function被標記async但不await ED其中時被調用。在這種情況下,編譯器不檢查Function是否在其本體中使用await(它已經在函數聲明中告訴過你)。它只是檢查你是否正在調用異步方法而不等待它。

C)

var handleOne = Task.Run(() => { Funcation(1, 1); }); // Runs Async 

我真的不知道在這一個,如果有人知道發生了什麼在這裏,請幫助。

d)

await Task.Factory.StartNew(() => Funcation(1, 1)); //awaits correctly 

一樣一個但你等待所創建的任務,一切都OK。創建一個任務來運行異步操作也是一個非常糟糕的主意。

E)

await Funcation(1, 1); //awaits correctly 

我們真的除了別的事情發生?這真的是你應該使用asyncawait的方式。

+0

B仍然是我困惑的時候,我運行它的代碼似乎B,因爲它是,不運行異步。它似乎運行同步,因爲它阻止當前線程向前移動。在B被稱爲直到B完成之後沒有任何運行。對於B,它運行異步還是同步? –

+0

編譯器在函數聲明中告訴你,你的異步方法不會等待任何事情,所以它會同步運行,當你像** B **那樣調用它時,它將同步運行 – dotctor

+1

「在調用之前繼續執行當前方法完成「我認爲這意味着呼叫是異步的,因爲當前的方法將繼續。 K所以我誤解了什麼是vs告訴我的。我想我明白了。 –

0

您的功能正在使用Wait,這是阻止。改爲使用await。此外,您將任務定義爲Task<int>,但沒有返回任何結果 - 不會編譯。它應該是這樣的:

static private async Task<int> Funcation(int x, int y) 
{ 
    await Task.Delay(1000); 

    return x + y; // some int result 
} 

使用您的代碼「E」來調用。其他調用都是不正確的。另外,如果你的代碼真的不需要延遲,那麼對於異步來說,這不是一個好的用例。異步操作應該做長期運行或IO綁定的事情。如果你的代碼只是執行簡單的算術,那麼就把它做成傳統的同步方法。