【发布时间】:2014-08-11 18:20:10
【问题描述】:
我目前正在从事一个有趣的项目。这是一个 C# WinForms 项目。基本上,使用应该加载一个Visual Studio解决方案文件,然后应用程序对其进行解析:根据文件中写入的内容构建对象等等(详细解释它的作用与问题无关,所以我会停在这里)。
我有一个主窗体 (frmMain),它提供了加载文件的界面,还有一个进度条 (analyzingProgressBar),应该显示文件解析的进度,因为它需要几秒钟。我已经设置了BackgroundWorker,但是卡住了-如何根据实际进度更新prgressbar?
我的代码是:
public partial class frmMain : Form
{
public frmMain()
{
InitializeComponent();
toolStripPseudo.Text = String.Empty;
toolStripPseudo.Spring = true;
}
private void openSolutionToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openSolutionDialog.ShowDialog() == DialogResult.OK)
{
Solution openSolution = new Solution(openSolutionDialog.FileName);
BackgroundWorker worker = new BackgroundWorker();
worker.WorkerReportsProgress = true;
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RunWorkerCompleted);
worker.ProgressChanged += new ProgressChangedEventHandler(this.ProgressChanged);
worker.DoWork += new DoWorkEventHandler(this.DoWork);
// start the worker thread
worker.RunWorkerAsync(openSolution);
}
}
private void DoWork(object sender, DoWorkEventArgs e)
{
// get a reference to the worker that started this request
BackgroundWorker workerSender = sender as BackgroundWorker;
Solution openSolution = e.Argument as Solution;
openSolution.AnalyzeSolution();
workerSender.ReportProgress() //What do I do here?
}
private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// TODO add graphics
}
public void ProgressChanged(object sender, ProgressChangedEventArgs e)
{
analyzingProgressBar.Value = e.ProgressPercentage;
}
}
【问题讨论】:
-
视情况而定——你的意思是仅仅读取文件还是解析一些文本?
-
解析。我使用 Regex 和诸如此类的东西来查找一些关键字并将加载文件中的信息加载到我制作的一些类中。
-
是的,我就是这么做的——谢谢。不过还是没有回答我的问题。
-
这个方法 openSolution.AnalyzeSolution();需要进入 DoWork 方法开始。但更重要的是,在您的 AnalyzeSolution() 中,您需要继续在您的工作人员上调用 ReportProgress 以便触发事件。把它放在你正在解析文件的循环中。
-
对,我就是这么想的。但是没有一个解析循环:它调用一堆创建对象、对象列表等的方法(它们调用其他方法)——它不仅仅是一个简单的循环。还有其他方法吗?
标签: c# user-interface progress-bar backgroundworker