2012-03-19 7 views
17

Come è possibile ottenere questo errore nell'evento DownloadStringCompleted? Non significa, è finito? C'è un altro evento da cui posso lanciarlo?WebClient non supporta le operazioni di I/O simultanee

Ricevo questo errore estremamente raramente, ma una volta ogni tanto accade sul mio telefono WP7. Ho un client web che faccio fuoco più e più volte e lo sparo di nuovo dall'evento completato. Sta succedendo perché c'è ancora qualche connessione stantia aperta? C'è un modo per prevenire questo 100%?

Ho verificato se c'è una possibilità che il thread si cammini su se stesso, ma viene attivato solo dall'evento completato.

Come posso essere sicuro, quando viene attivato l'evento completo, il client non è più èBusy? Un suggerimento era quello di aggiungere un po 'di tempo con un thread in attesa mentre il client è occupato.

Alcuni pseudo codice.

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

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

risposta

8

L'unica risposta è quella di creare un nuovo webclient nell'ambito della Manifestazione completato. Non è possibile impostarlo su nuovo poiché webclient è in sola lettura. La creazione di un nuovo client è l'unica soluzione. Ciò consente al vecchio client di completare in background. Questo ha delle piccole implicazioni sulla memoria dato che stai creando una nuova istanza invece di riutilizzare una vecchia. Ma il garbage collector dovrebbe tenerlo pulito se il tuo scope è impostato correttamente.

15

Il WebClient supporta solo una singola operazione, non è possibile scaricare più file. Non hai mostrato il tuo codice, ma suppongo che tu stia in qualche modo licenziando una nuova richiesta prima che il vecchio sia completato. La mia scommessa è che WebClient.IsBusy è vero quando si tenta di eseguire un altro recupero.

Vedere questo thread:

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

+0

Il mio punto è che non ho mai chiamo downloadasync a meno che io sono in caso completato. La connessione non dovrebbe essere chiusa e il client è gratuito se sono in quell'evento? Se questo non è il caso, come posso evitare di utilizzare IsBusy? – firebellys

+0

Sì, questa discussione mi sta dicendo di fare esattamente quello che sto facendo ora e sto ricevendo l'errore. Aggiungerò qualche altra informazione sopra. – firebellys

+1

Solo per salvare qualcuno, la risposta sopra riportata è solo per i collegamenti qui: http://stackoverflow.com/questions/2042258/webclient-downloadfileasync-download-files-one-at-a-time – TEK

0

La soluzione, ho trovato è utilizzare più oggetti WebClient, in modo da modificare l'esempio di pseudocodice; provare

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

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

Invece di utilizzare l'uso WebClient HttpClient di fare chiamate HTTP parallele. Sotto il codice mostra come scaricare i file.

 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

Questo è l'unico post che risolve effettivamente questo problema. Calci in culo grazie amico. +1 –

Problemi correlati