Невозможно выполнить следующий код после 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");
}