我有一個簡單的文件下載器,我從服務器獲取一些文件,然後顯示一條消息,通知它是成功還是失敗。下面的代碼:等待Task.WhenAll似乎完成,但它永遠不會到達下一行代碼
public async Task GetFiles(IEnumerable<string> urlList)
{
//some variable declaring, setting etc.
await Task.WhenAll(urlList.Select(url => Task.Run(() => DownloadFile(url, dir, count++))).ToList());
//problem lies here, the WhenAll never completes
if (fileDownloadError)
{
Directory.Delete(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "downloads"));
MessageBox.Show("Fail");
return;
}
MessageBox.Show("Success");
}
internal async Task DownloadFile(string url, string dir, int count)
{
string filename = HelperClass.GetFilenameFromUrl(url);
long a = 0;
newList.Add(a);
using (var client = new WebClient())
{
TempDownload tp = new TempDownload()
{
id = count
};
client.DownloadProgressChanged += new DownloadProgressChangedEventHandler((sender, e) => ProgressChanged(sender, e, tp));
client.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
await client.DownloadFileTaskAsync(url, string.Concat(dir, "\\", filename));
}
}
的ProgressBar
我DownloadProgressChanged
事件改變達到100%,文件被正確下載,但代碼中的WhenAll
從未執行後,也就是它從來沒有擊中if (fileDownloadError)
斷點,沒有消息框顯示等。有什麼我在這裏失蹤?
放置代碼,看看你得到一個異常 – jdweng
也許有些線程異常在你的代碼中。註釋掉「DownloadProgressChaged」和「DownloadFileCompleted」事件,看看它是否有效。如果有效,問題出在這些事件處理程序上。 – AjS
@jdweng我試過了,沒有,它從來沒有捕捉到任何東西,只是愉快地掛在WhenAll -AjS註釋事件處理程序除了阻止相關的進度條工作之外沒有任何作用 – Janushoff