У меня есть ProgressBarWindow, в котором есть индикатор выполнения и кнопка отмены, которую я использую, чтобы сообщить о прогрессе файлового ввода-вывода.Тем не менее, поток пользовательского интерфейса в ProgressBarWindow и мое главное окно зависают, несмотря на всю работу, выполняемую в фоновом режиме.Индикатор выполнения отображается, как и мое главное окно, но не обновляется, пока фоновый работник делает свое дело.Следующий код вызывается в самом конце конструктора главного окна:
iCountLogLinesProgressBar = new ProgressBarWindow();
iCountLogLinesProgressBar.cancelButton.Click += EventCountLogLinesProgressBarCancelButtonClicked;
iCountLogLinesProgressBar.Show();
iCountLogRecords = new BackgroundWorker();
iCountLogRecords.DoWork += EventCountLogLinesDoWork;
iCountLogRecords.ProgressChanged += EventCountLogLinesProgressChanged;
iCountLogRecords.RunWorkerCompleted += EventCountLogLinesRunWorkerCompleted;
iCountLogRecords.WorkerReportsProgress = true;
iCountLogRecords.WorkerSupportsCancellation = true;
iCountLogRecords.RunWorkerAsync(new BinaryReader(File.Open(iMainLogFilename, FileMode.Open, FileAccess.Read)));
EventCountLogLinesProgressChanged () выглядит так:
private void EventCountLogLinesProgressChanged(object sender, ProgressChangedEventArgs e)
{
iCountLogLinesProgressBar.Value = e.ProgressPercentage;
}
Вот сокращенная версия ProgressBarWindow (остальное - только пара установщиков):
public partial class ProgressBarWindow : Window
{
public ProgressBarWindow()
{
InitializeComponent();
this.progressBar.Value = this.progressBar.Minimum = 0;
this.progressBar.Maximum = 100;
}
public double Value
{
get
{
return progressBar.Value;
}
set
{
this.progressBar.Value = value;
}
}
}
Я попытался обернуть строку установщика значений в делегат dispatcher.invoke, но это дает мне переполнение стека (мне не нужно было иметьВ любом случае, dispatcher.invoke вызывает строку, поскольку фоновый работник вызывает ProgressChanged в потоке пользовательского интерфейса, верно?).Я проверил MSDN и Google, но я не могу найти никого другого с этой проблемой.
РЕДАКТИРОВАТЬ Извините, я не понял, что мой упрощенный код заблокировал поток пользовательского интерфейса, я получаю точно такое же поведение, несмотря на использование фонового работника, поэтому я ошибочно предположил, что они эквивалентны.Я должен был упомянуть, что использовал фонового работника: P