2012-03-19 172 views
17

如何從DownloadStringCompleted事件中得到此錯誤?這不就是說,它完成了嗎?是否有另外一個事件可以解決這個問題?WebClient不支持併發I/O操作

我很少遇到這個錯誤,但偶爾會發生在我的WP7手機上。我有一個網絡客戶端,我一遍又一遍地開火,然後從完成的事件中再次開啓。這是否發生,因爲仍然存在一些陳舊的連接?有沒有辦法來防止這100%?

我已檢查過線程是否有機會自行走過,但它僅在完成的事件中被解僱。

我怎樣才能確定,當整個事件被解僱時,客戶端不再是isBusy?一個建議是在客戶端忙時添加一段線程睡眠時間。

一些僞代碼。

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
client.downloadasync(); //This is where we break. 
} 

回答

8

唯一的答案就是在完成事件的範圍內創建一個新的Web客戶端。由於webclient是隻讀的,您不能將其設置爲新的。創建一個新的客戶端是唯一的解決方案。這允許舊客戶端在後臺完成。這確實有輕微的內存影響,因爲你正在創建一個新的實例,而不是重用舊的。但是如果你的範圍設置正確,垃圾收集器應該保持乾淨。

15

WebClient只支持單一操作,它不能下載多個文件。你沒有顯示你的代碼,但我的猜測是,你在某種程度上在舊的完成之前觸發了一個新的請求。我敢打賭,當您嘗試執行另一次獲取時,WebClient.IsBusy爲真。

請參見下面的主題:

wb.DownloadFileAsync throw "WebClient does not support concurrent I/O operations." exception

+0

我的觀點是我從來沒有打電話downloadasync,除非我在完成的事件。如果我在這種情況下,連接應該關閉還是客戶端免費?如果情況並非如此,除了使用IsBusy之外,我怎樣才能避免它? – firebellys 2012-03-19 07:12:18

+0

是的,這個線程告訴我要做什麼,我現在正在做什麼,我得到的錯誤。我會在上面添加更多信息。 – firebellys 2012-03-20 07:50:08

+1

只是爲了保存任何人的麻煩,上面的答案只是鏈接到這裏:http://stackoverflow.com/questions/2042258/webclient-downloadfileasync-download-files-one-at-a-time – TEK 2016-05-11 16:20:52

0

我找到的解決方案是使用多個WebClient對象,以便修改您的僞代碼示例;嘗試

var client = new WebClient("URL 1"); 
client.CompletedEvent += CompletedEvent; 
client.downloadasync(); 

void CompletedEvent(){ 
Dosomestuff; 
var client2 = new WebClient(); 
client2.downloadasync(); 
} 
1

而不是使用WebClient使用HttpClient執行並行HTTP調用。下面的代碼顯示瞭如何下載文件。

 HttpClient httpClient = new HttpClient(); 
     var documentList=_documentManager.GetAllDocuments(); 
     documentList.AsParallel().ForAll(doc => 
     { 

      var responseResult= httpClient.GetAsync(doc.FileURLPath); 
      using (var memStream = responseResult.Result.Content.ReadAsStreamAsync().Result) 
      { 
       using (var fileStream =File.Create($"{filePath}\\{doc.FileName}")) 
       { 
        memStream.CopyTo(fileStream); 
       } 

      } 
     }); 
+0

這是唯一的帖子,實際上解決這個問題。踢屁股感謝的人。 +1 – 2017-11-17 21:47:04