2014-01-25 237 views
1

我有關於異步編程的方式和等待的問題。我明白,當方法是異步的時候,你可以使用await來等待特定代碼的執行,但我想多瞭解一些。異步方法並等待

所以我有一個具體的問題:

想象我有一個方法:

public async void Starter() 
{ 
    string username = await GetUserNameFromDBAsync(); 
    bool updated = await UpdateUserTown(); 
} 

public async static Task<string> GetUserNameFromDBAsync() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     return await context.User.FindByIdAsync(currentid).Name; 
    } 
} 

public async static Task<bool> UpdateUserTown() 
{ 
    using(DBContext context = new DBContext()) 
    { 
     User user = await context.User.FindUserByIDAsync(currentid); 
     user.Town="New Town"; 
     try 
     { 
      context.SaveChangesAsync(); 
     } 
     catch(Exception ex) 
     {return false} 
     return true; 
    } 
} 

好這樣的代碼,雖然我到處使用異步,但我有足夠的時間做等待.. 。所以基本上的表現,它會完全一樣,如果我會刪除所有這些異步,並等待,並沒有...

或者,也許我想念的東西?

回答

6

在桌面應用程序中,async不是關於性能,而是關於響應性。在執行長時間運行的I/O綁定操作時,您不希望應用程序的GUI凍結。實現這一點的通常方式是通過線程,但線程昂貴且難以正確同步,而且如果您想要的只是在從Web服務中拉取數據時保持UI的響應,那麼它們就會過度殺傷。

在Web應用程序中,具有async控制器同時讓你的網站的過程中更多的請求,因爲你的控制器上運行的線程可以返回到線程池,併爲更多的請求,同時它的等待你的await s到完成。

此外,您的代碼註釋:您應該從來沒有有東西標記爲async void,除非它是一個事件處理程序。您不能使用awaitasync void方法,並且無法捕獲發生的異常。相反,如果您的方法不返回任何內容,請使用async Task

+0

哦,我明白了,所以即使在web應用程序中,因爲我認爲如果我必須等待數據庫等的響應,確定如果您仍然需要等待,使用異步的要點)))現在,我看,這意味着它可以同時服務器來自其他webbrowsers的其他請求...因爲在這種情況下,我更多地談論web應用程序) – Alnedru

+0

順便說一句我想問,你有任何類型的資源,我會能夠閱讀關於網絡應用和異步? – Alnedru