我正在制作一个小工具,它读入一堆文件,如果文件不包含这些行,则添加某些xml。这很有效,但由于目录和文件较大,可能会耗费时间。
因此,我决定使用backgroundworker并添加一个进度条,显示我们在执行中的位置。
但问题是进度条不会更新。
参考代码:
BackgroundWorker bw = new BackgroundWorker();
Form progressForm = new Form();
ProgressBar progressBar = new ProgressBar();
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
if (!csprojPaths.Any())
{
MessageBox.Show(Resources.noprojectsfound);
}
else
{
for (int i = 0; i < csprojPaths.Count(); i++)
{
string csprojPath = csprojPaths[i];
CheckOutFromTFS(csprojPath);
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(csprojPath);
Convert(xmlDoc, ruleset);
xmlDoc.Save(csprojPath);
bw.ReportProgress(i);
}
}
}
private void bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressBar.Value = e.ProgressPercentage;
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
progressForm.Close();
DisplayDialog(csprojPaths);
}
public void ConvertIn(string pad, string rules)
{
bw.DoWork += new DoWorkEventHandler(bw_DoWork);
bw.ProgressChanged += new ProgressChangedEventHandler(bw_ProgressChanged);
bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted);
path = pad;
ruleset = rules;
csprojPaths = Directory.GetFiles(path, "*.csproj", SearchOption.AllDirectories);
progressForm.Size = new Size(30, 30);
progressForm.Controls.Add(progressBar);
progressBar.Visible = true;
progressBar.Minimum = 0;
progressBar.Maximum = csprojPaths.Count();
progressBar.Value = 0;
progressBar.Step = 1;
progressForm.ShowDialog();
bw.WorkerSupportsCancellation = false;
bw.WorkerReportsProgress = true;
if (!bw.IsBusy)
{
bw.RunWorkerAsync();
}
}
带有进度条的表单会打开,但永远不会关闭,也不会更新栏。当我关闭progressForm时,DisplayDialog(csprojPaths)会被执行。如果我保持progressForm打开,它就不会。
我在这里做错了什么?
答案 0 :(得分:2)
问题: progressForm.ShowDialog()
等待,除非表单已关闭以执行其他语句。因此,progressForm.ShowDialog()
之后的语句将不会被执行,直到表格被关闭。
解决方案:您需要致电progressForm.Show()
,这不会阻止程序流程。
因为它将独立打开progressForm,因此progressForm.Show()
之后的语句也会在不等待的情况下执行。
来自MSDN:Form.ShowDialog()
您可以使用此方法在您的中显示模式对话框 应用。调用此方法时,后面的代码不是 执行直到对话框关闭后。
替换它:
progressForm.ShowDialog();
有了这个:
progressForm.Show();