2013-04-13 250 views
3

最近正在嘗試異步並等待使用c#。這是我的代碼c#異步和等待

private async void button1_Click(object sender, EventArgs e) 
    { 
    textBox1.Text = string.Empty; 

    var client = new WebClient(); 

    var sw = Stopwatch.StartNew(); 

    var downloadStringTask = client.DownloadStringTaskAsync("http://www.google.com"); 

    textBox1.Text += "Downloading string async "+sw.ElapsedMilliseconds; 
    sw.Restart(); 

    await downloadStringTask; 

    textBox1.Text += Environment.NewLine + "Downloaded "+sw.ElapsedMilliseconds; 
    sw.Stop(); 
} 

這個輸出IM在textbox1.text

Downloading string async 5698 
Downloaded 666 

得到這意味着僅調用DownloadStringTaskAsync()正在圍繞5.6 Seconds執行,其中作爲實際的下載正在<1 second。當使用此方法的原因是保存線程資源。

如果這是真的,是否有任何實際的情況下,這種WebClient類的方法應該被使用?或者我只是想完全不正確的條款?

+0

嗯,只測量一次可能會導致誤導性的數字 – Patrick

+0

@Patrick我願意在我的網絡應用程序中使用它,其中每次都創建控制器 –

+2

這不僅僅是下載數據所花費的時間,還包括時間解決第一次下載所需的dns和時間。 我建議你應該嘗試再打一次電話。它將產生與此時不同的結果,dns已經解析並緩存,並且頁面也被緩存。 –

回答

3

我第一次接近300毫秒,之後每次接近0毫秒。關於我所期望的。當你第一次使用代碼時總會有一大塊開銷。至少你要測量讓System.Net代碼加載到程序中並初始化的成本。 WebClient似乎也有一些開銷,例如,我看到一個異常在通過註冊表查看Web代理時被捕獲和處理。基本的東西需要做的事情之前可以異步完成。

不過,5.7秒是很長的時間。你應該看看環境的東西,你的機器的其他部分,當你在做某些互聯網時就想參與其中。就像那個Web代理一樣,它可能被設置爲自動配置,並且需要時間。或者像您的反惡意軟件或防火牆對您開始使用出站IP地址感到興奮。 Etcetera,涉及到網絡的許多移動部件,它絕不相同。

+0

+1。 .NET總是執行同步代理自動檢測(可能包括DNS請求,下載代理腳本,旋轉AppDomain以將JavaScript編譯爲IL,並執行它)以及(我認爲)DNS查找。因此,如果您有任何代理/ DNS問題,那麼「異步」HTTP方法突然不是異步的。 :( –

2

您正在測量設置時間。在我的機器(和Internet連接),第一個呼叫生產:

Downloading string async 2636 // Varies wildly, can be up to 15s on some runs. 
Downloaded 385 

雖然後續調用始終如一地生產:

Downloading string async 0 
Downloaded 289 // With small variations. 
+0

亞這是我幾次嘗試後遇到的,但究竟是SETUP TIME? –

0

正如其他人所說,你測量一次性設置費用,但是作爲「多次運行」的替代方案,您可以「預熱」特定的Web客戶端。

例如,這兩條線之間,增加一個(同步)下載*調用

var client = new WebClient(); 

var sw = Stopwatch.StartNew(); 

也許是這樣的:

var client = new WebClient(); 

// different site, to help avoid pre-filling any caches involved 
client.DownloadData("http://www.microsoft.com/"); 

var sw = Stopwatch.StartNew(); 

然後您最初的測量將不包括最初的Web客戶端設置,甚至你的第一次運行應該有準確的時間安排(並且應該更好地匹配多次執行相同的呼叫,假設每次都有HTTP 200結果,並且沒有從本地緩存或304中提供)