wake-up-neo.net

WebClient unterstützt keine gleichzeitigen E/A-Vorgänge

Wie kann ich diesen Fehler im DownloadStringCompleted-Ereignis mit abrufen? Bedeutet das nicht, dass es fertig ist? Gibt es noch ein anderes Ereignis, von dem aus ich schießen kann?

Ich erhalte diesen Fehler äußerst selten, aber er wird gelegentlich auf meinem WP7-Telefon vorkommen. Ich habe einen Web-Client, den ich immer wieder feuere, und ich feuern ihn erneut von der abgeschlossenen Veranstaltung ab. Ist dies der Fall, weil immer noch eine veraltete Verbindung besteht? Gibt es eine Möglichkeit, dies zu 100% zu verhindern?

Ich habe geprüft, ob der Thread eine Chance hat, über sich selbst hinwegzugehen, er wird jedoch nur aus dem abgeschlossenen Ereignis ausgelöst.

Wie kann ich sicher sein, dass der Client nicht mehr isBusy ist, wenn das vollständige Ereignis ausgelöst wird? Ein Vorschlag war, eine Weile mit einem Thread-Ruhezustand hinzuzufügen, während der Client beschäftigt ist.

Ein Pseudo-Code.

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

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

Die einzige Antwort ist, einen neuen Webclient im Bereich des Completed Events zu erstellen. Sie können es nicht auf new setzen, da der Webclient schreibgeschützt ist. Das Erstellen eines neuen Kunden ist die einzige Lösung. Dadurch kann der alte Client im Hintergrund abgeschlossen werden. Dies hat geringfügige Auswirkungen auf den Speicher, da Sie eine neue Instanz erstellen, anstatt eine alte Instanz erneut zu verwenden. Der Garbage Collector sollte es jedoch sauber halten, wenn das Oszilloskop richtig eingestellt ist.

10
firebellys

Der WebClient unterstützt nur einzelne Vorgänge, es können nicht mehrere Dateien heruntergeladen werden. Sie haben Ihren Code nicht angezeigt, aber ich schätze, dass Sie eine neue Anfrage starten, bevor die alte abgeschlossen ist. Meine Wette ist, dass WebClient.IsBusy wahr ist, wenn Sie versuchen, einen anderen Abruf auszuführen.

Siehe den folgenden Thread:

wb.DownloadFileAsync throw "WebClient unterstützt keine gleichzeitigen E/A-Vorgänge." Ausnahme

17
ColinE

Verwenden Sie anstelle von WebClient HttpClient, um parallele HTTP-Aufrufe auszuführen. Der folgende Code zeigt, wie Dateien heruntergeladen werden.

        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);
                }

            }
        });
3
Ahamed Ishak

Die Lösung, die ich gefunden habe, ist die Verwendung mehrerer WebClient-Objekte, um Ihr Pseudocode-Beispiel zu ändern. Versuchen

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

void CompletedEvent(){
Dosomestuff;
var client2 = new WebClient();
client2.downloadasync(); 
}
0
Fiach Reid