Невозможно выполнить следующий код после DownloadFileAsync в C#?

Я использую 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 не проблема Строка 5 также работает очень хорошо, когда я удаляю Строку 3.

Точно так же, когда я удаляю Строку 3 и Строка 5 идет очень хорошо, Строка 8 не будет выполнена. Так в чем же проблема с этим кодом? Должен ли я убить процесс, используемый client или что-то?

++) я не собираюсь использовать youtube-dl во время загрузки видеоданных, поэтому, пожалуйста, не говорите мне использовать youtube-dl.

1 ответ

Решение

Вы должны начать с чтения лучших практик асинхронного программирования и заметить, что один из принципов - "асинхронный полностью".

Применительно к вашему коду любой метод / класс, в котором находится ваш код, сам должен быть 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");
}
Другие вопросы по тегам