我想使用后台线程来加载XML数据的过程,可能还有一个进度条让用户知道应用程序正在积极地做某事。 我通过搜索网写了这段代码 我想在用户cliks浏览按钮时在winform上加载树视图中的XML树。 在大型XML文件的情况下winform冻结。所以让用户知道在后台工作正在进行我想要添加进度条。我在这里使用了后台工作者。
但它引发了System.ArgumentException的异常,在 xmlDocument.Load(txtFileName.Text); 这一行。
我的xml文件格式正确,位于我选择的正确位置。
但我无法找到此异常的原因。
你可以帮忙或者告诉我代码中的更正吗?
谢谢......
private void btnBrowse_Click(object sender,EventArgs e)
{
bgWorker1.RunWorkerAsync();
StripProgressBar.Value = 0;
toolStripStatusLabel1.Text = "Browsing for a Xml file";
if (open.ShowDialog(this) == DialogResult.OK)
{
txtFileName.Text = open.FileName;
initiatingTree(open.FileName); //this variable gives the name of selected file
}
while (this.bgWorker1.IsBusy)
{
StripProgressBar.Increment(1);
// Keep UI messages moving, so the form remains
// responsive during the asynchronous operation.
Application.DoEvents();
}
}//Browse button
private void bgWorker1_DoWork(object sender, DoWorkEventArgs e)
{
xmlDocument = new XmlDocument();
Thread.Sleep(5000);
xmlDocument.Load(txtFileName.Text);
btnBrowse.Enabled = false;
}
private void bgworker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
// Set progress bar to 100% in case it's not already there.
StripProgressBar.Value = 100;
if (e.Error == null)
{
MessageBox.Show(xmlDocument.InnerXml, "Download Complete");
}
else
{
MessageBox.Show("Failed to download file");
}
// Enable the Browse button and reset the progress bar.
this.btnBrowse.Enabled = true;
StripProgressBar.Value = 0;
toolStripStatusLabel1.Text = "work finished processing request.";
}//workerCompleted
答案 0 :(得分:4)
当用户点击“浏览”时,您可以通过调用
立即启动异步过程bgWorker1.RunWorkerAsync();
这会调用后台工作程序的DoWork
方法,该方法会休眠5秒,并从txtFileName.Text
中提取值,无论用户是否已在FileOpenDialog
中完成输入。
最好将byWorker1.RunWorkerAsync()
(和忙碌的等待)移动到if (open.ShowDialog(this) == DialogResult.OK)
区块。
private void btnBrowse_Click(object sender,EventArgs e)
{
StripProgressBar.Value = 0;
toolStripStatusLabel1.Text = "Browsing for a Xml file";
if (open.ShowDialog(this) == DialogResult.OK)
{
txtFileName.Text = open.FileName;
initiatingTree(open.FileName);
bgWorker1.RunWorkerAsync();
while (this.bgWorker1.IsBusy)
{
StripProgressBar.Increment(1);
// Keep UI messages moving, so the form remains
// responsive during the asynchronous operation.
Application.DoEvents();
}
}
}
对于这些类型的问题,将断点放在文件将要加载的位置,并查看发生这种情况时的值是很有帮助的......你可能会注意到它是用空字符串调用的
您可能还会考虑带有参数的RunWorkerAsync
版本;您可以以这种方式传递文件,而不是尝试从文本框中异步读取它。
就个人而言,我不会使用调用Application.DoEvents()
的循环;相反,我会将控制权返回给UI线程,然后将Invoke()
从异步线程返回到它,以实现进度条更新。
答案 1 :(得分:1)
当方法bgWorker1.RunWorkerAsync();被称为DoWork被解雇的事件。
因为在应用程序的开头调用了该方法,所以文件名文本框为空。
我希望你明白。