Обработка события в потоке подписчика - C # - PullRequest
1 голос
/ 03 апреля 2011

Я провел небольшое исследование по обработке многопоточных событий C #, потому что у меня было подозрение, что обработчики событий будут просто вызываться в любом потоке, вызвавшем событие, что оказывается истинным.

Теперь это выглядит какдействительно плохая идея, потому что код, который подписывается на событие в объекте, может вообще не быть разработанным, чтобы быть многопоточным, и реализация этого объекта (который должен быть черным ящиком, нет?), если многопотоковый негласно (как в моем случае) может привести к тому, что код подписчика будет выполняться в нескольких потоках, вызывая всевозможные странные проблемы.

Поэтому мой вопрос заключается в том, можно ли отправить событие обратно в поток, на который изначально была подписанаэто, таким образом, избежать какого-либо неожиданного параллелизма на уровне подписчика?Или, говоря более абстрактно, могу ли я записать текущий поток в определенный момент времени и вставить вызов обработчика событий (или любой произвольный фрагмент кода) в этот поток в более поздний момент времени?

Клинкерэто: я делаю это в DLL, которая не ссылается на WinForms или WPF.Я знаю, что в этих структурах существуют конструкции, позволяющие это сделать (и я сам их использовал), но я хочу сделать это без ссылки на эти библиотеки.

Небольшая справка:

Мой дизайн использует фоновые потоки для работы с объектом, что может привести к изменению его свойств.Я использую INotifyPropertyChanged, чтобы сообщить об изменениях этих свойств наблюдателям.Я использую WPF вне библиотеки для отображения этих объектов в интерфейсах, поэтому INotifyPropertyChanged полезен, потому что он сообщает WPF обновить экран при изменении свойства отображаемого объекта.

Я предполагаю, что WPFобрабатывает многопоточные уведомления об изменениях внутри, поэтому, если бы я придерживался исключительно WPF, вероятно, проблем не было бы.Однако я бы хотел, чтобы кто-нибудь мог подписаться на события изменений и не беспокоиться о том, что они вызываются в фоновых потоках.

1 Ответ

2 голосов
/ 03 апреля 2011

Вы можете использовать класс SynchronizationContext для запуска кода в потоке пользовательского интерфейса без ссылки на WinForms или WPF.

Capture SyncronizationContext.Current всякий раз, когда вы добавляете обработчик, затем используйте захваченные экземпляры для вызова каждого обработчика.

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