Обработка события, вызванного фоновым потоком - PullRequest
1 голос
/ 03 марта 2011

Я разработал класс (в C #) для отправки и получения сообщений по сети. Он создает новый поток (поток слушателя), который ожидает прибытия нового сообщения, а затем вызывает событие. Проблема в том, что событие возникает в потоке слушателя, и когда я хочу использовать этот класс в приложении wpf, возникает ошибка времени выполнения при попытке обработать событие Ошибка: вызывающий поток не может получить доступ к этому объекту, так как он принадлежит другому потоку.

Есть ли какой-нибудь правильный способ справиться с этой ситуацией, когда событие возникает в упомянутом классе?

Ответы [ 2 ]

2 голосов
/ 03 марта 2011

Вы должны быть в потоке пользовательского интерфейса для обновления объектов пользовательского интерфейса.Вы можете использовать диспетчер окна, чтобы выполнить там код:

this.Dispatcher.Invoke(new Action(() =>
{
    // Code that updates UI here
}));
2 голосов
/ 03 марта 2011

BackgroundWorker явно поддерживает маршалинг в поток пользовательского интерфейса.Вы должны использовать это, хотя, вызовите его метод ReportProgress ().Несмотря на то, что вы оптимизированы для составления отчетов о прогрессе, у вас нет , чтобы использовать его для этого.Есть перегрузка, которая принимает объект, вы можете передать все, что захотите.Обработчик события получает его как значение e.UserState.Оттуда вы можете использовать этот объект напрямую или использовать его для повторного вызова другого набора событий.

Будьте осторожны с требованиями безопасности потоков для этого объекта.Работник продолжает работать и не каким-либо образом синхронизирован с выполнением обработчика событий ProgressChanged.Так что больше не следует обновлять объект.Лучше всего создать его новый экземпляр после вызова ReportProgress ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...