2

试验 WebClient.DownloadFileAsync:

public void DownloadFile(string fileUrl, string localFile)
{
    using (WebClient client = new WebClient())
    {
        downloadingFile = true;
        client.DownloadFileCompleted += client_DownloadFileCompleted;
        client.DownloadFileAsync(new Uri(fileUrl), localFile);

        while (downloadingFile) { };
    }
}

private void client_DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
    downloadingFile = false;
}

问题是 DownloadFileCompleted 事件永远不会被触发,所以我从未设置 downloadFile = false => while 循环永远不会完成。

关于出了什么问题的任何想法?

谢谢!

4

2 回答 2

1

这似乎是一个逻辑错误(一种死锁情况),因为您的主线程在一个条件上连续循环并且即使下载完成也永远没有时间引发事件。

解决方案#1:删除 while (downloadingFile) { }; 释放主线程的行,如果要保持控制流,可以使方法 DownloadFile 异步并使用以下代码行来等待 DownloadFile 方法的变体。

await client.DownloadFileTaskAsync(new Uri(fileUrl), localFile);
于 2016-01-14T05:49:23.663 回答
0

您必须从您的事件处理程序 (Client_DownloadFileCompleted) 返回一个 AsyncCompletedEventHandler 类型的实例,而不是 void。

有关详细信息,请参阅MSDN 链接。

于 2016-01-14T05:39:04.017 回答