如何在加载xml文件期间使用进度条

Riz*_*han 4 c# progress-bar

我想在加载远程xml文件期间显示进度条.我在Visual C#2008 Express Edition中使用Windows应用程序表单.

private void button1_Click(object sender, EventArgs e)
    {
        string text =  textBox1.Text;
        string url = "http://api.bing.net/xml.aspx?AppId=XXX&Query=" + text + "&Sources=Translation&Version=2.2&Market=en-us&Translation.SourceLanguage=en&Translation.TargetLanguage=De";

        XmlDocument xml = new XmlDocument();
        xml.Load(url);

        XmlNodeList node = xml.GetElementsByTagName("tra:TranslatedTerm");

        for (int x = 0; x < node.Count; x++ )
        {
            textBox2.Text = node[x].InnerText;
            progressbar1.Value = x;
        }
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码不能显示进度条加载..请建议我一些代码.提前致谢

rot*_*man 9

你想通过进度条反映出什么?而是下载文件(因为它很大)或处理文件?

进度条反映处理文件

您的进度条不会更改,因为您的方法是同步的 - 单位结束时不会发生任何其他事情.BackgroundWorkerclass专为这类问题而设计.它以异步方式执行主要工作,并能够报告进度已更改.以下是如何更改tour方法以使用它:

private void button1_Click(object sender, EventArgs e)
{
    string text =  textBox1.Text;
    string url = "http://api.bing.net/xml.aspx?AppId=XXX&Query=" + text + "&Sources=Translation&Version=2.2&Market=en-us&Translation.SourceLanguage=en&Translation.TargetLanguage=De";

    XmlDocument xml = new XmlDocument();
    xml.Load(url);
    XmlNodeList node = xml.GetElementsByTagName("tra:TranslatedTerm");

    BackgroundWorker worker = new BackgroundWorker();

    // tell the background worker it can report progress
    worker.WorkerReportsProgress = true;

    // add our event handlers
    worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(this.RunWorkerCompleted);
    worker.ProgressChanged += new ProgressChangedEventHandler(this.ProgressChanged);
    worker.DoWork += new DoWorkEventHandler(this.DoWork);

    // start the worker thread
    worker.RunWorkerAsync(node);
}
Run Code Online (Sandbox Code Playgroud)

现在,主要部分:

private void DoWork(object sender, DoWorkEventArgs e)
{
   // get a reference to the worker that started this request
   BackgroundWorker workerSender = sender as BackgroundWorker;

   // get a node list from agrument passed to RunWorkerAsync
   XmlNodeList node = e.Argument as XmlNodeList;

   for (int i = 0; x < node.Count; i++)
   {
       textBox2.Text = node[i].InnerText;
       workerSender.ReportProgress(node.Count / i);
   }
}

private void RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    // do something after work is completed     
}

public void ProgressChanged( object sender, ProgressChangedEventArgs e )
{
    progressBar.Value = e.ProgressPercentage;
}
Run Code Online (Sandbox Code Playgroud)

反映下载文件的进度条

尝试使用HttpWebRequest将文件作为流来获取.

// Create a 'WebRequest' object with the specified url. 
WebRequest myWebRequest = WebRequest.Create(url); 

// Send the 'WebRequest' and wait for response.
WebResponse myWebResponse = myWebRequest.GetResponse(); 

// Obtain a 'Stream' object associated with the response object.
Stream myStream = myWebResponse.GetResponseStream();

long myStreamLenght = myWebResponse.ContentLength;
Run Code Online (Sandbox Code Playgroud)

所以现在你知道这个XML文件的长度了.然后,你必须异步读取流内容(BackgroundWorkerStreamReader是一个好主意).使用myStream.PositionmyStreamLenght计算进度.

我知道我不是很具体,但我只是想让你朝着正确的方向前进.我认为在这里写下所有这些内容是没有意义的.在这里,您有链接可以帮助您处理StreamBackgroundWorker: