我正在使用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。
答案 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");
}