在C#中使用DownloadFileAsync后无法执行下一个代码?

时间:2017-09-27 10:02:16

标签: c# webclient downloadfileasync

我正在使用WebClient.DownloadFileAsync同时制作youtube下载程序并且使用它时遇到问题。

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是我正在使用的另一个类,它运行得很好,所以不用担心它。但是我遇到问题的地方是在执行第3行之后。第3行和第4行执行得很好,第5行也不会被执行。当我使用DownloadFile代替DownloadFileAsync时,代码效果非常好,因此this.AudLink没有问题。当我删除第3行时,第5行也能很好地工作。

同样,当我删除第3行和第5行非常顺利时,不会执行第8行。那么这段代码有什么问题呢?我应该杀掉client使用过程吗?

++)我在下载视频数据时不会使用youtube-dl,所以请不要告诉我使用youtube-dl。

1 个答案:

答案 0 :(得分:1)

你应该开始阅读best practices for async programming并注意其中一个原则是"一直异步#34;。

应用于您的代码,您的代码所在的任何方法/类本身应该是async。此时,您可以await进行异步下载

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