2017-09-27 6 views
0

J'utilise WebClient.DownloadFileAsync tout en rendant YouTube Downloader et j'ai un problème à l'utiliser.Impossible d'exécuter le code suivant après DownloadFileAsync en C#?

WebClient client = new WebClient(); 
Process.Text("", "Downloading video data...", "new"); 
client.DownloadFileAsync(new Uri(this.VidLink), this.path + "\\tempVid"); // Line3 
Process.Text("", "Downloading audio data...", "old"); 
client.DownloadFileAsync(new Uri(this.AudLink), this.path + "\\tempAud"); // Line5 

FFMpegConverter merge = new FFMpegConverter(); 
merge.Invoke(String.Format("-i \"{0}\\tempVid\" -i \"{1}\\tempAud\" -c copy \"{2}{3}\"", this.path, this.path, dir, filename)); // Line8 
merge.Stop(); 
Process.Text("", "Video merging complete", "new"); 

Process est une autre classe que je utilise, et il fonctionne très bien, si jamais l'esprit à ce sujet. Mais j'ai un problème après l'exécution de la ligne 3. Les lignes 3 et 4 sont très bien exécutées et la ligne 5 ne sera pas exécutée. Lorsque j'ai utilisé DownloadFile au lieu de DownloadFileAsync, le code a très bien fonctionné, donc this.AudLink ne pose aucun problème. La ligne 5 fonctionne également très bien lorsque je supprime la ligne 3.

De même, lorsque je supprime la ligne 3 et la ligne 5, la ligne 8 ne sera pas exécutée. Alors, quel est le problème avec ce code? Dois-je tuer le processus utilisé par client ou quelque chose?

++) Je ne vais pas utiliser youtube-dl lors du téléchargement de données vidéo, alors ne me dites pas d'utiliser plutôt youtube-dl.

+1

Vous devriez être 'await'ing vos appels asynchrones, ou en utilisant une autre méthode pour déterminer le moment où ils sont faits. – Jamiec

+0

@Jamiec Je me demandais la même chose .. si l'extrait de code était incomplet ou incorrect .. Sinon, toutes les méthodes en attente peuvent appeler .Result mais je ne le conseillerais pas. – rmjoia

+0

attendez ou essayez d'utiliser 2 objets différents de webClient, ou faites-le dans différentes tâches, et utilisez Tâche1. ContinueWith avec un autre. – Amit

Répondre

1

Vous devriez commencer par lire le best practices for async programming et noter que l'un des principes est "async jusqu'au bout".

Appliqué à votre code, quelle que soit la méthode/classe à laquelle votre code se trouve, il doit être lui-même async. À ce moment-là, vous pouvez await vos téléchargements async

private async Task DoMyDownloading() 
{ 
    WebClient client = new WebClient(); 
    Process.Text("", "Downloading video data...", "new"); 
    await client.DownloadFileAsync(new Uri(this.VidLink), this.path + "\\tempVid"); // Line3 
    Process.Text("", "Downloading audio data...", "old"); 
    await client.DownloadFileAsync(new Uri(this.AudLink), this.path + "\\tempAud"); // Line5 

    FFMpegConverter merge = new FFMpegConverter(); 
    merge.Invoke(String.Format("-i \"{0}\\tempVid\" -i \"{1}\\tempAud\" -c copy \"{2}{3}\"", this.path, this.path, dir, filename)); // Line8 
    merge.Stop(); 
    Process.Text("", "Video merging complete", "new"); 
} 
+0

J'ai résolu le problème en utilisant des objets 'client' et en téléchargeant des données audio quand' AsyncCompletedEvent' s'est produit. Merci pour le conseil, cependant, et le document que vous m'avez proposé de lire m'a été très utile. –