【问题标题】:WebClient - DownloadFileAsync not working when called second timeWebClient - 第二次调用时,DownloadFileAsync 不起作用
【发布时间】:2016-09-22 13:50:57
【问题描述】:

我已经构建了下载单个文件的简单方法。当我第一次调用该方法时,一切正常,但是当我第二次调用该方法时,没有下载文件。
以下是我的代码:

public void DownloadFile(string fileUrl, string path)
{
    using (var webClient = new WebClient())
    {
        webClient.DownloadFileCompleted += (sender, e) =>
        {
            if (e.Error == null & !e.Cancelled)
            {
                Debug.WriteLine(@"Download completed!");
            }
        };

        var url = new Uri(fileUrl);

        try
        {
            webClient.OpenRead(url);
            string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
            string filename = new ContentDisposition(headerContentDisposition).FileName;

            Debug.WriteLine(filename);

            path = Path.Combine(path, filename);
            webClient.DownloadFileAsync(url, path);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }
}

我已经确定了中断下载的部分,它是负责获取文件名的部分:

webClient.OpenRead(url);
string headerContentDisposition = webClient.ResponseHeaders["content-disposition"];
string filename = new ContentDisposition(headerContentDisposition).FileName;

如果我用string filename = "1.tmp"; 替换该部分,我可以多次调用我的方法而不会出错。

我通过单击带有此单击事件的按钮来调用该方法:

private void button1_Click(object sender, EventArgs e)
{
    const string url = @"http://www.jtricks.com/download-text";
    const string target = @"D:\TEMP\";
    DownloadFile(url, target);
}

在没有获取文件名的代码的情况下单击两次按钮后,我在控制台中得到以下输出:

1.tmp
Download completed!
1.tmp
Download completed!

下面是 gif 显示此工作正常:

当我添加获取文件名的部分时,这是我的输出:

content.txt
Download completed!
content.txt

下面的 gif 显示了该行为:

我第二次点击开始我得到文件名,但下载没有开始,下次点击阻止开始按钮。

我该如何解决这个问题?理想情况下,我想尽可能多地拨打DownloadFile

【问题讨论】:

  • 考虑到您在调用DownloadFileAsync 后没有阻塞,并且您的 WebClient 应该在下载完成之前被处理掉,我对您的代码完全正常工作感到非常震惊。另外,你打电话给webClient.OpenRead(url);,但你没有做任何事情with the stream it is returning
  • @ScottChamberlain 我已经根据我找到的博客条目 - ourcodeworld.com/articles/read/227/… 构建了我的代码。我确信内部使用的异步会失败,但它可以工作。
  • 那个博客是一个非常非常糟糕的例子,它到处都在犯错误,我不相信那个作者的任何帖子,他们似乎不知道自己在做什么.
  • @ScottChamberlain 我发现了第二个使用锁和监视器的示例 - alexfeinberg.wordpress.com/2014/09/14/… 这更好吗?
  • @Misiu 你能解决这个问题吗?我们遇到了完全相同的问题!

标签: c# winforms webclient .net-4.6


【解决方案1】:

似乎WebClient正在使用缓存。我建议你必须告诉WebClient 不要使用缓存:

webClient.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore);

【讨论】:

  • 我马上试试。我已经开始重写我的代码以使用HttpClient,但是那里很难获得下载文件的进度,所以如果您的建议有帮助,那么我会留下这段代码
  • 我试过你的代码,但不幸的是它没有帮助。我的应用程序的行为仍然如我的问题中的第二个 gif 所示。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-15
  • 2016-03-30
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多