在具有不同 类 的 Windows 窗体中使用带有进度条的 BackgroundWorker

Using BackgroundWorker with Progressbar in WindowsForm with different Classes

我有 2 个不同的 classes downloadWiki 和 GetLinks,每个都有一个循环需要一点时间来执行,还有一个 Form.cs class 我的按钮和进度条是。

我的 downloadWiki 有一个循环遍历不同的 html 页面,GetLinks class 有一个循环获取每个 Wiki 页面上的每个 link 并将其发送到我的 downloadWiki class。在一些 if 语句之后,我下载了其中一些 wiki。 现在我的问题是,我在过去的 2 小时内尝试为使用 links 的循环和下载维基页面的循环实现进度条和后台工作程序。但我没有找到解决办法。 这是我在 Windows 表单代码中执行的代码。所以我不知道如何将 backgroundWorker 发送给那两个 classes.

如果您需要更多代码,请发表评论。

抱歉,如果这个问题很容易 google,但我是 "newbie" C#

    private void button1_Click(object sender, EventArgs e)
    {
        DownloadWikis wikis = new DownloadWikis();
    }

首先,您需要配置您的 backgroundworker:

    public FrmMain()
    {
        InitializeComponent();

        _backgroundWorker.WorkerReportsProgress = true;
        _backgroundWorker.ProgressChanged += _backgroundWorker_ProgressChanged;
        _backgroundWorker.DoWork += _backgroundWorker_DoWork;
        _backgroundWorker.RunWorkerCompleted += _backgroundWorker_RunWorkerCompleted;
    }

你想要一个progressBar,所以你的backgroundWorker需要报告进度。该工作将异步完成,因此您需要指定一个委托来执行您的下载。

    private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        DownloadWikis wikis = new DownloadWikis();

    }

在您的 DownloadWikis class 中,写一个委托。会帮助我们调用backgroundworker的ReportProgress方法

     public delegate void ReportProgressDelegate(int percentage);

更新您的下载签名,它应该是这样的:

    public void Download(ReportProgressDelegate reportProgress)
    {
        // FirstLoop
        for(int i=0; i < 100; i++)
        {
            // Do some work with GetLinks
            // this will call the backgroundworker ReportProgress method.
            reportProgress(i);
        }
    }

现在,您可以完成此操作:

    private void _backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        DownloadWikis wiki = new DownloadWikis();
        wiki.Download(_backgroundWorker.ReportProgress);
    }

处理进度条值,第二个代表来了:

     private void _backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
     {
        progressBar1.Value = e.ProgressPercentage;
     }

通过这一步,您将能够看到您的工作何时完成:

     private void _backgroundWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        MessageBox.Show("It's done !");
    }

最后一步,简单的一步:

    private void btnDownloadWikis_Click(object sender, EventArgs e)
    {
        _backgroundWorker.RunWorkerAsync();
    }

现在,您必须做一些数学运算才能确定您的百分比。