C# WebClient.DownloadDataAsync能否封装在一个类中?
我正在尝试封装WebClient异步下载方法,以便在等待下载冗长文件时获得进度条更新。MSDN文档表明FTPDownloadCompleted和FTPDownloadProgressChanged位于不同的线程上,但它们从不触发。也许我做得不对,但我需要避免同步事件、回调等。。所以我想我应该试试这条路。 我特别好奇的是,如果这些事件是另一个线程上的代理,为什么它们不会触发C# WebClient.DownloadDataAsync能否封装在一个类中?,c#,webclient,C#,Webclient,我正在尝试封装WebClient异步下载方法,以便在等待下载冗长文件时获得进度条更新。MSDN文档表明FTPDownloadCompleted和FTPDownloadProgressChanged位于不同的线程上,但它们从不触发。也许我做得不对,但我需要避免同步事件、回调等。。所以我想我应该试试这条路。 我特别好奇的是,如果这些事件是另一个线程上的代理,为什么它们不会触发 class downloadFTP { public delegate void ProgressBarUpdat
class downloadFTP
{
public delegate void ProgressBarUpdate(Int32 val);
ProgressBarUpdate progressBarUpdate;
WebClient webClient;
Int32 waitTime = 60;
Double percentComplete = 0;
Boolean transferComplete = false;
public Boolean TransferComplete { get { return transferComplete; } }
Byte[] downloadData = null;
public Boolean DownLoadFTPFile(String filename, ProgressBarUpdate pbUpdate)
{
Boolean result = false;
progressBarUpdate = pbUpdate;
AutoResetEvent waiter = new System.Threading.AutoResetEvent (false);
webClient = new WebClient();
webClient.Credentials = new NetworkCredential(user.userId, user.passWd);
webClient.DownloadDataCompleted += new DownloadDataCompletedEventHandler(FTPDownloadCompleted);
webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(FTPDownloadProgressChanged);
webClient.DownloadDataAsync(new Uri(ftpURL + "//" + filename),waiter);
waiter.WaitOne(waitTime*1000);
return TransferComplete;
}
private void FTPDownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
percentComplete = e.ProgressPercentage;
}
private void FTPDownloadCompleted(object sender, DownloadDataCompletedEventArgs e)
{
downloadData = e.Result;
transferComplete = true;
}
WebClient在当前服务器上运行回调(请参阅)
如果当前SynchronizationContext是WinForms或WPF事件循环,则您的
DownLoadFTPFile
方法会阻止线程,事件不会显示。解决方案:删除AutoResetEvent。完成后,不要忘记处理WebClient实例(Silverlight除外)。删除AutoResetEvent将无法达到此目的。我想在下载文件或超时时返回,同时更新进度条。我有一个带有thread.sleep调用的循环,但我想这会更容易。