Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WebClient.DownloadDataAsync能否封装在一个类中?_C#_Webclient - Fatal编程技术网

C# WebClient.DownloadDataAsync能否封装在一个类中?

C# WebClient.DownloadDataAsync能否封装在一个类中?,c#,webclient,C#,Webclient,我正在尝试封装WebClient异步下载方法,以便在等待下载冗长文件时获得进度条更新。MSDN文档表明FTPDownloadCompleted和FTPDownloadProgressChanged位于不同的线程上,但它们从不触发。也许我做得不对,但我需要避免同步事件、回调等。。所以我想我应该试试这条路。 我特别好奇的是,如果这些事件是另一个线程上的代理,为什么它们不会触发 class downloadFTP { public delegate void ProgressBarUpdat

我正在尝试封装WebClient异步下载方法,以便在等待下载冗长文件时获得进度条更新。MSDN文档表明FTPDownloadCompleted和FTPDownloadProgressChanged位于不同的线程上,但它们从不触发。也许我做得不对,但我需要避免同步事件、回调等。。所以我想我应该试试这条路。 我特别好奇的是,如果这些事件是另一个线程上的代理,为什么它们不会触发

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调用的循环,但我想这会更容易。