0

我知道这里有很多问题,但我经历了很多,但运气不佳。我是事件和后台工作人员的新手,我只是不知道实现这一点的最佳方法。

我在 C# 中有一个基本的 Windows 窗体。它包含一个进度条。我正在调用一个下载文件的类。我希望进度条根据该下载进行更新。如果一切都在同一个班级,我可以正常工作,但在这种情况下我无法让它工作。处理此问题的最佳方法是什么,我该如何处理?目前我正在这样做:

WebClient downloader = new WebClient();             
downloader.DownloadFileCompleted += new AsyncCompletedEventHandler(Completed);
downloader.DownloadProgressChanged += new DownloadProgressChangedEventHandler(ProgressChanged);

然后为了进步改变我这样做:

public void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
{
    pbDownload.Value = e.ProgressPercentage;
}

但是当我把除了进度条之外的所有内容放在一个单独的类中时,它就变得一团糟了。想法?谢谢!

4

2 回答 2

0

我有这个女巫与您尝试做的事情大致相同并且工作正常 FStatus ... 表格参考

 FrmStatus FStatus = null;

        public void ProgressInit(String caption, string opis, int Max)
        {
            FStatus = new SZOKZZ.FrmStatus();
            FStatus.InitProc(Max);
            FStatus.SetCaption(caption, opis);
            FStatus.Show();
        }

        public void DLProgress(string curl, string cdl)
        {
            WebClient webClient = new WebClient();
            webClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DLDone);
            webClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DLSetProc);
            webClient.DownloadFileAsync(new Uri(curl), cdl);
        }
        private void DLSetProc(object sender, DownloadProgressChangedEventArgs e)
        {
            this._FileProcentDownloaded = e.ProgressPercentage;
            FStatus.SetProcDL(this._FileProcentDownloaded);

        }
        private void DLDone(object sender, AsyncCompletedEventArgs e)
        {
            _DlError = e.Error;
            FStatus.Dispose();
            FStatus = null;
        }
于 2013-02-07T08:03:40.633 回答
0

你应该调用 Application.DoEvents(); 强制您的表单根据控件的新值更新控件:

   public void ProgressChanged(object sender, DownloadProgressChangedEventArgs e)
        {
            pbDownload.Value = e.ProgressPercentage;
            Application.DoEvents();
        }

问候

于 2013-02-07T10:45:49.833 回答