| 

.NET C# Java Javascript Exception

2
Ich möchte aus dem Internet mehrere Dateien per WebClient herunterladen und verwalte die URLs dieser Dateien über ein Zeichenkettendatenfeld mit dem Namen "WebFiles". Das ganze funktioniert auch mit dem folgenden Konstrukt, wobei der lokale Dateiname je nach Datei über die Variable lName gesondert festgelegt wird (aus dem lokalen Zielpfad und dem Dateinamen der Datei, die aus dem Web heruntergeladen wird):

Dim wObj as New WebClient
For Each wFile as String In WebFiles()
...
lName as String = "…"
wObj.DownloadFile(New Uri(wFile), lName)
Next


An dieser Stelle erfolgt das laden synchron, also nacheinander. Wie erreiche ich das asynchrone Laden mit der Methode DownloadFileAsync? Der Aufruf selbst ist ja identisch. Lediglich das schrittweise Laden sowie das Ende kann mit den Ereignissen DownloadProgressChanged und DownloadFinished überwacht werden. Würde ich jetzt dieselbe Schleife durchlaufen, würden alle Downloads angestossen, so dass spätestens beim zweiten Download keine Überwachung des Herunterladens zu einer bestimmten Datei mehr möglich ist. Wie erreiche ich, dass sich die Downloads nicht wechselseitig beeinflussen und ich diese allesamt parallel überwachen kann?
21.06.2012
1 Antwort
1
Wie wäre es mit der Nutzung der Methode DownloadFileAsync(uri Adress, string filename, object userToken)?

Als userToken gibst Du etwas eindeutiges mit. Dieses Token kannst Du dann in der Methode DownloadFileCompleted abfragen. Eine mögliche Implementation sähe dann beispielsweise so aus:

private readonly Dictionary<Guid, string> Webfiles = new Dictionary<Guid, string>();
private readonly Dictionary<Guid, string> WebfileProcessed = new Dictionary<Guid, string>();

private string lName = string.Empty;

public void FillDictionary()
{
Webfiles.Add(new Guid(), "test1.exe");
Webfiles.Add(new Guid(), "test2.exe");
Webfiles.Add(new Guid(), "test3.exe");
Webfiles.Add(new Guid(), "test4.exe");
}

public void SendeFiles()
{
WebClient client = new WebClient();
client.DownloadFileCompleted += client_DownloadFileCompleted;
foreach (KeyValuePair<Guid, string> webfile in Webfiles)
{
lName = "blablabla";
client.DownloadFileAsync(new Uri(webfile.Value),lName, webfile.Key);

}
}
void client_DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
Guid webfileId = (Guid)e.UserState;
if (e.Cancelled)
WebfileProcessed.Add(webfileId, "Cancelled");
if (e.Error!=null)
WebfileProcessed.Add(webfileId, e.Error.ToString());
// usw.

}


Und in vb.net
Private ReadOnly Webfiles As New Dictionary(Of Guid, String)()
Private ReadOnly WebfileProcessed As New Dictionary(Of Guid, String)()

Private lName As String = String.Empty

Public Sub FillDictionary()
Webfiles.Add(New Guid(), "test1.exe")
Webfiles.Add(New Guid(), "test2.exe")
Webfiles.Add(New Guid(), "test3.exe")
Webfiles.Add(New Guid(), "test4.exe")
End Sub

Public Sub SendeFiles()
Dim client As New WebClient()
AddHandler client.DownloadFileCompleted, AddressOf client_DownloadFileCompleted
For Each webfile As KeyValuePair(Of Guid, String) In Webfiles
lName = "blablabla"

client.DownloadFileAsync(New Uri(webfile.Value), lName, webfile.Key)
Next
End Sub
Private Sub client_DownloadFileCompleted(sender As Object, e As AsyncCompletedEventArgs)
Dim webfileId As Guid = DirectCast(e.UserState, Guid)
If e.Cancelled Then
WebfileProcessed.Add(webfileId, "Cancelled")
End If
If e.[Error] IsNot Nothing Then
WebfileProcessed.Add(webfileId, e.[Error].ToString())
End If
' usw.

End Sub
28.06.2012
JEwen 2,6k 5

Stelle deine .net-Frage jetzt!