无法在 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");
}
我在制作 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");
}