上传Xml文件的进度条

时间:2009-03-02 13:41:46

标签: c# file upload progress-bar backgroundworker

我想使用后台线程来加载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  

2 个答案:

答案 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被解雇的事件。

因为在应用程序的开头调用了该方法,所以文件名文本框为空。

我希望你明白。