Вы не можете обновить элемент управления пользовательского интерфейса из любого потока, кроме потока пользовательского интерфейса.Как правило, BackgroundWorker
позаботится о корректном повышении событий ProgressChanged
и RunWorkerCompleted
в потоке пользовательского интерфейса.Поскольку в данном случае это не так, вы могли бы самостоятельно направить логику обновления пользовательского интерфейса в поток пользовательского интерфейса, используя метод Invoke
:
txtPastes.Invoke(new Action(() =>
{
// This code is executed on the UI thread.
txtPastes.Text = (string)e.UserState;
}));
Если вы работаете в WPF, выпотребуется вызвать Invoke
на диспетчере элемента управления:
txtPastes.Dispatcher.Invoke(new Action(() =>
{
txtPastes.Text = (string)e.UserState;
}));
Обновление : Как отметили Томас Левеск и Ганс Пассант, вам следует выяснить причину, по которой ваше событие ProgressChanged
не поднимается в потоке пользовательского интерфейса.Я подозреваю, что вы запускаете BackgroundWorker
слишком рано в жизненном цикле инициализации приложения, что может привести к условиям гонки и, возможно, к NullReferenceException
, если первое событие ProgressChanged
возникнет до инициализации вашего текстового поля txtPastes
.