Вы запускаете асинхронный процесс немедленно, когда пользователь нажимает «Обзор», вызывая
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()
; вместо этого я вернул бы управление обратно в поток пользовательского интерфейса, а затем Invoke()
на него из асинхронного потока, чтобы выполнить обновления индикатора выполнения.