2016-07-12 9 views
1

Ich arbeite an einer UWP-App, um einige Dateien über das Internet herunterzuladen. Ich verwende die BackgroundDownloader-Klasse, um sie im Hintergrund herunterzuladen. Hier ist ein Teil meines Codes.Wie kann DownloadOperation das Ereignis ProgressChanged häufiger aufrufen?

public BackgroundDownloader backgroundDownloader = new BackgroundDownloader(); 
DownloadOperation downloadOperation = backgroundDownloader.CreateDownload(source, file); 
Progress<DownloadOperation> progress = new Progress<DownloadOperation>(progressChanged); 
CancellationTokenSource cancellationToken = new CancellationTokenSource(); 
await downloadOperation.StartAsync().AsTask(cancellationToken.Token, progress); 

Alles funktioniert gut, aber ich bemerke ein seltsames Verhalten. Ich aktualisiere das Datenmodell in der progressChanged-Methode, die die Benutzeroberfläche benachrichtigt und aktualisiert. Aber beim Herunterladen einer Datei wird das progressChanged-Ereignis ausgelöst, wenn etwa 1 MB der Datei auf einer langsamen Internetverbindung heruntergeladen wurde, und wenn ich den Download pausiere und fortsetze, löst er dieses Ereignis aus, sagen wir alle paar KB. Ich möchte wissen, dass es eine Möglichkeit gibt zu konfigurieren, wie häufig das ProgressChanged-Ereignis ausgelöst wird. Ich habe das Internet durchsucht, aber nichts gefunden. Bitte helfen Sie.

Antwort

1

Vielen Dank für Ihr Feedback. Ich kann ähnliches Verhalten in meiner Seite sehen. Nach dem Pausieren und Fortsetzen des Download-Vorgangs wird der Handler progressChanged häufiger aufgerufen. Es gibt jedoch keine API, die die Häufigkeit steuern kann, mit der der Fortschrittsrückruf aufgerufen wurde. Der im Konstruktor Progress<DownloadOperation> festgelegte Handler wird jedes Mal aufgerufen, wenn die Windows-Laufzeitmethode eine Fortschrittsbenachrichtigung meldet. Aber diese Implementierung ist zugrunde, wir können sie nicht kontrollieren.

Wenn Sie die Frequenz erhöhen möchten, kann eine hässliche Problemumgehung die Download-Operation in Code anhalten und fortsetzen, nachdem der Downloadvorgang gestartet wurde. Zum Beispiel können wir ein Flag hinzufügen, um die zuerst gestartete Download-Operation zu identifizieren.

private bool firstStart = true; 

Und dann in progressChanged Handler, anhalten und den Download-Vorgang fortzusetzen.

if (firstStart && currentProgress.Status == BackgroundTransferStatus.Running) 
{ 
    download.Pause(); 
    await Task.Delay(100); 
    download.Resume(); 
    firstStart = false; 
} 

Dies ist keine gute Praxis und ich habe dieses Problem intern gemeldet. Ich werde meine Antwort aktualisieren, sobald irgendwelche Fortschritte gemacht werden.

+0

Danke für die Unterstützung. Manchmal ist es nicht möglich, den Download wieder aufzunehmen, da der Link nach der ersten Antwort abläuft. Ich warte also auf die Behebung des Problems. –

Verwandte Themen