Asynchrones und paralleles Herunterladen von Dateien

8

BEARBEITEN

Ich habe den Titel der Frage geändert, um das Problem wiederzugeben, das ich hatte, aber auch eine Antwort darauf, wie man das leicht erreichen kann.

Ich versuche, die 2. Methode so zu machen, dass Task<TResult> anstelle von Task wie in der ersten Methode zurückgegeben wird, aber ich bekomme eine Kaskade von Fehlern als Folge davon, es zu reparieren.

  • Ich habe return vor await body(partition.Current); hinzugefügt
  • Im Gegenzug bittet es mich, eine Return-Anweisung hinzuzufügen, so dass ich return null unterhalb von
  • hinzugefügt habe
  • Aber jetzt klagt die select-Anweisung, dass sie das Argument type nicht aus der Abfrage
  • ableiten kann
  • Ich ändere Task.Run in Task.Run<TResult> , aber ohne Erfolg.

Wie kann ich es beheben?

Die erste Methode kommt von Ссылка , die zweite Methode ist die Überladung, die ich versuche zu erstellen.

%Vor%

Anwendungsbeispiel:

Mit dieser Methode möchte ich mehrere Dateien parallel und asynchron herunterladen:

%Vor%     
Aybe 04.10.2013, 19:28
quelle

1 Antwort

23

Ich habe es gelöst und es hier gepostet, könnte jedem helfen, der das gleiche Problem hat.

Mein erstes Bedürfnis war ein kleiner Helfer, der Bilder schnell herunterladen würde, aber auch die Verbindung einfach abbricht, wenn der Server nicht schnell antwortet, all dies parallel und asynchron .

Dieser Helfer gibt Ihnen ein Tupel zurück, das den Remote-Pfad, den lokalen Pfad und die Ausnahme enthält, falls eine aufgetreten ist; also ziemlich nützlich, denn es ist immer gut zu wissen, warum fehlerhafte Downloads fehlerhaft sind. Ich denke, ich habe keine der Situationen vergessen, die bei einem Download auftreten können, aber Sie können es gerne kommentieren.

  • Sie geben eine Liste mit URLs zum Herunterladen an
  • Sie können einen lokalen Dateinamen angeben, wo er gespeichert wird, wenn nicht einer für Sie erstellt wird
  • Optional eine Dauer für das Abbrechen eines Downloads (nützlich für langsame oder unerreichbare Server)

Sie können einfach DownloadFileTaskAsync selbst verwenden oder den Helfer ForEachAsync für parallele und asynchrone Downloads verwenden.

Code mit einem Beispiel zur Verwendung:

%Vor%

Ich habe die Signatur von ForEachAsync nicht geändert, um das Niveau der Parallelität zu wählen. Ich lasse es nach Ihren Wünschen anpassen.

Ausgabebeispiel:

%Vor%

Was früher bis zu einer Minute dauerte, dauert kaum 10 Sekunden für das gleiche Ergebnis:)

Und vielen Dank an den Autor dieser 2 Beiträge:

Ссылка

Ссылка

    
Aybe 05.10.2013, 18:46
quelle

Tags und Links