Во-первых, исключение ObjectDisposedException является здесь только одной возможной ошибкой. Выполнение кода OP в большинстве случаев приводило к следующему исключению InvalidOperationException:
Invoke или BeginInvoke не могут быть вызваны
на элементе управления, пока ручка окна
был создан.
Полагаю, это можно исправить, запустив рабочий с обратным вызовом «Loaded», а не с помощью конструктора, но всего этого тяжелого испытания можно избежать, если использовать механизм создания отчетов BackgroundWorker's Progress. Хорошо работает следующее:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while (!this.bgWorker.CancellationPending)
{
this.bgWorker.ReportProgress(Environment.TickCount);
Thread.Sleep(1);
}
}
private void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
this.textBox1.Text = e.ProgressPercentage.ToString();
}
Я угнал процентный параметр, но можно использовать другую перегрузку для передачи любого параметра.
Интересно отметить, что удаление вышеуказанного спящего вызова приводит к засорению интерфейса пользователя, потреблению высокой загрузки ЦП и постоянно увеличивает использование памяти. Я думаю, это как-то связано с перегруженной очередью сообщений графического интерфейса. Тем не менее, при неактивном режиме ожидания загрузка ЦП практически равна нулю, и использование памяти тоже выглядит нормально. Чтобы быть осторожным, возможно, следует использовать более высокое значение, чем 1 мс? Мнение эксперта здесь будет оценено ... Обновление : Похоже, что пока обновление не слишком частое, оно должно быть в порядке: Ссылка
В любом случае я не могу предвидеть сценарий, в котором обновление GUI должно происходить с интервалами короче пары миллисекунд (по крайней мере, в тех случаях, когда человек наблюдает за GUI), поэтому я думаю, что большинство Отчет о прогрессе времени будет правильным выбором