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

Unable to execute next code after DownloadFileAsync in C#?

我在制作 YouTube 下载器时使用 WebClient.DownloadFileAsync,但在使用时遇到问题。

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

同样,当我删除第3行并且第5行运行良好时,第8行将不会执行。那么这段代码有什么问题呢?我应该终止 client 或其他使用的进程吗?

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

您应该开始阅读 best practices for async programming 并注意其中一项原则是 "async all the way"。

应用于您的代码,无论您的代码在 method/class 中,它本身都应该是 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");
}