Что именно вы хотите отразить в индикаторе выполнения? Скорее загрузка файла (потому что он большой) или обработка файла?
Индикатор выполнения, отражающий файл обработки
Ваш индикатор прогресса не меняется, потому что ваш метод синхронный - ничего не произойдет, пока он не закончится. Класс BackgroundWorker
идеально подходит для такого рода задач. Он выполняет основную работу в асинхронном режиме и может сообщить, что прогресс изменился. Вот как можно изменить метод тура, чтобы использовать его:
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);
}
Теперь основная часть:
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;
}
Индикатор выполнения загрузки файла
Попробуйте использовать 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;
Итак, теперь вы знаете длину этого XML-файла. Затем вы должны асинхронно читать содержимое из потока (BackgroundWorker
и StreamReader
- хорошая идея). Используйте myStream.Position
и myStreamLenght
для расчета прогресса.
Я знаю, что я не очень конкретен, но я просто хотел направить вас в правильном направлении. Я думаю, что не имеет смысла писать обо всех этих вещах здесь. Здесь у вас есть ссылки, которые помогут вам разобраться с Stream
и BackgroundWorker
: