2017-09-27 62 views
0

我在使用WebClient.DownloadFileAsync製作YouTube下載器時遇到問題,並使用它。無法在C#中的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是另一個類我使用,它工作得很好,所以從來不介意這件事。但是我遇到問題的地方是在執行第3行之後。第3行和第4行執行得非常好,第5行不會執行。當我使用DownloadFile而不是DownloadFileAsync時,代碼工作得很好,所以this.AudLink沒有問題。當我刪除第3行時,第5行也很好。

同樣,當我刪除第3行和第5行非常好時,第8行將不會執行。那麼這個代碼有什麼問題?我應該殺死client或其他什麼?

++)我不打算在下載視頻數據時使用youtube-dl,所以請不要告訴我使用youtube-dl。

+1

你應該'await'ing你的異步調用,或使用其他一些方法,以確定他們完成時。 – Jamiec

+0

@Jamiec我想知道相同的..如果代碼片段不完整或不正確..或者所有的等待方法可以調用.Result,但我不會建議。 – rmjoia

+0

等待或嘗試使用2個不同的webClient對象,或者在不同的任務中執行它,並使用Task1。繼續與其他人一起。 – Amit

回答

1

您應該從閱讀best practices for async programming開始,注意其中一個原則是「一路異步」。

適用於您的代碼,無論您的代碼在裏面的方法/類本身應該是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"); 
} 
+0

我在發生'AsyncCompletedEvent'時通過使用'client'對象和下載音頻數據解決了這個問題。不過謝謝你的建議,你提供給我的文檔非常有幫助。 –

相關問題