我尝试下载这样的文件:
WebClient _downloadClient = new WebClient();
_downloadClient.DownloadFileCompleted += DownloadFileCompleted;
_downloadClient.DownloadFileAsync(current.url, _filename);
// ...
下载后我需要使用下载文件启动另一个进程,我尝试使用DownloadFileCompleted
事件。
void DownloadFileCompleted(object sender, System.ComponentModel.AsyncCompletedEventArgs e)
{
if (e.Error != null)
{
throw e.Error;
}
if (!_downloadFileVersion.Any())
{
complited = true;
}
DownloadFile();
}
但是,我无法知道AsyncCompletedEventArgs
下载文件的名称,我自己制作了
public class DownloadCompliteEventArgs: EventArgs
{
private string _fileName;
public string fileName
{
get
{
return _fileName;
}
set
{
_fileName = value;
}
}
public DownloadCompliteEventArgs(string name)
{
fileName = name;
}
}
但我无法理解如何调用我的活动DownloadFileCompleted
对不起,如果这是个问题
答案 0 :(得分:17)
一种方法是创建一个闭包。
WebClient _downloadClient = new WebClient();
_downloadClient.DownloadFileCompleted += DownloadFileCompleted(_filename);
_downloadClient.DownloadFileAsync(current.url, _filename);
这意味着您的DownloadFileCompleted需要返回事件处理程序。
public AsyncCompletedEventHandler DownloadFileCompleted(string filename)
{
Action<object,AsyncCompletedEventArgs> action = (sender,e) =>
{
var _filename = filename;
if (e.Error != null)
{
throw e.Error;
}
if (!_downloadFileVersion.Any())
{
complited = true;
}
DownloadFile();
};
return new AsyncCompletedEventHandler(action);
}
我创建名为_filename的变量的原因是捕获传递给DownloadFileComplete方法的文件名变量并将其存储在闭包中。如果你没有这样做,你就无法访问闭包中的filename变量。
答案 1 :(得分:3)
我正在玩DownloadFileCompleted
以获取文件路径/文件名。我也试过上面的解决方案,但这不像我的期望那么我喜欢添加Querystring值的解决方案,在这里我想与你分享代码。
string fileIdentifier="value to remember";
WebClient webClient = new WebClient();
webClient.DownloadFileCompleted += new AsyncCompletedEventHandler (DownloadFileCompleted);
webClient.QueryString.Add("file", fileIdentifier); // here you can add values
webClient.DownloadFileAsync(new Uri((string)dyndwnldfile.path), localFilePath);
事件可以定义如下:
private void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
{
string fileIdentifier= ((System.Net.WebClient)(sender)).QueryString["file"];
// process with fileIdentifier
}