在具有不同 类 的 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();
}
现在,您必须做一些数学运算才能确定您的百分比。
我有 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();
}
现在,您必须做一些数学运算才能确定您的百分比。