2014-02-24 69 views
0

我期待更好地瞭解異步編程模型。讓我們假設在下面稱爲Web服務需要1秒鐘,返回:異步編程模型和應用程序規模

async Task<int> AccessTheWebAsync() 
{ 
    HttpClient client = new HttpClient(); 

    string urlContents = await client.GetStringAsync("http://service.com"); 

    return urlContents.Length; 
} 

它是正確的說,當await與異步方法使用當前線程產生回線程池的其他工作?是否使用異步模型爲每個請求節省了1秒的工作時間,因爲該線程並未等待Web服務響應?

+0

定義'節省1秒的工作'。每個請求都是一秒鐘嗎?多線程永遠不會保存你的工作。同樣的工作總是要進行。但是,它可以節省您的時間。 – Gusdor

+0

一般來說,這意味着線程可以用於其他工作。異步'GetStringAsync'方法使用異步I/O回調,所以它甚至不需要使用新線程。換句話說,在一個I/O綁定的應用程序中,擁有更多的線程根本沒有幫助。異步調用'AccessTheWebAsync' 100次將意味着它將花費大約1秒鐘的時間,而不是在一個線程中同步完成100秒。 – Luaan

+0

@Gusdor通過儲蓄,我的意思是一個線程不會花費一些時間而不做有用的工作,因爲它正在等待某些事情做出迴應。 –

回答

2

說當await與異步方法一起使用時,當前線程返回到線程池進行其他工作是否正確?

是。

是否使用異步模型爲每個請求節省了1秒的工作時間,因爲該線程並沒有圍繞等待Web服務響應?

它釋放了本來會被阻塞的那一秒的線程。

這從單個請求的角度來看沒有區別;請求仍然需要等待操作完成,並且請求不關心它是同步等待(塊)還是異步等待(等待)。但是,從服務器應用程序的角度來看,它有所不同:處理大量請求所需的線程數量較少。

2

調用線程在調用await語句時立即返回。如果你在一個上下文線程(一個UI或ASP.net線程)上,那麼行爲是不同的,但結果大致相同。

如果沒有其他代碼跟在後面,線程將只返回到池,並且vcalling線程實際上是一個線程池線程。

0

我曾嘗試在WebApi中使用asyncawait調用。發生什麼事是,當你到達await聲明時,控制權給予調用方法unitl,任務(在這種情況下爲client.GetStringAsync("http://service.com"))已完成。這是一個問題,因爲調用方法試圖返回一個值,而不管任務的完成,如果任務是完成,你會得到一個異常,像

一個返回語句被稱爲異步任務仍在進行中

在你的情況,因爲你只有一個操作,即從另一個站點獲取內容,你不需要它是異步。如果您從兩個或更多獨立站點獲取內容,那麼使用異步調用是有意義的。