【发布时间】: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!
当我添加获取文件名的部分时,这是我的输出:
content.txt
Download completed!
content.txt
我第二次点击开始我得到文件名,但下载没有开始,下次点击阻止开始按钮。
我该如何解决这个问题?理想情况下,我想尽可能多地拨打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