2012-06-20 168 views
4

使用modified WebClient快速失敗了,我從服務具有以下特點定期下載數據:與Web客戶端

  • 的數據下載(〜1GB),可採取大約20分鐘
  • 有時,服務決定不完全返回任何數據(請求掛起),或者花費幾分鐘到幾小時返回第一個字節。

如果服務沒有在合理的(可配置的)時間內返回任何數據,而且還有足夠的時間讓下載成功,我希望快速失敗。

看來,WebRequest.Timeout財產controls the total time for the request to complete,而ReadWriteTimeout控件可用的總時間來讀取數據,一旦數據傳輸開始。

我是否缺少一個屬性來控制建立連接和返回第一個字節之間等待的最長時間?如果沒有這種財產,我該如何處理這個問題?

回答

2

我不知道任何額外的超時屬性,將實現您正在尋找的結果。首先想到的是將一個處理程序附加到DownloadProgressChanged,它將更新一個標誌以指示已收到數據(但並非總是準確)。

使用TimerEventWaitHandle然後,您可以在短時間內阻塞(或者如果您願意,可以處理異步)並評估是否收到任何數據。下面的代碼並不是一個完整的例子,而是一個如何實現的想法。

using (var manualResetEvent = new ManualResetEvent(false)) 
using (var client = new WebClient()) 
{ 
    client.DownloadProgressChanged += (sender, e) => manualResetEvent.Set(); 
    client.DownloadDataAsync(new Uri("https://github.com/downloads/cbaxter/Harvester/Harvester.msi")); 

    if (!manualResetEvent.WaitOne(5000)) 
     client.CancelAsync(); 
} 

在上面的例子中,manualResetEvent.WaitOne將返回true如果DownloadProgressChanged被調用。您可能會想要檢查e.BytesReceived > 0並只設置爲非零值,但我認爲您明白了嗎?

+0

我害怕這將是確切的答案:-( –