powered by simpleCommunicator - 2.0.54     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Invoke event`а
8 сообщений из 8, страница 1 из 1
Invoke event`а
    #38909974
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!

Не могу найти никак ответ на свой вопрос! Помогите, пожалуйста!

Есть у меня класс. Он работает с оборудованием по ком порту, общается с ним, играет в карты и пр. Иногда он дёргает event и сообщает что выиграл в карты передаёт подписчикам данные.

В главной программе у меня создаётся экземпляр такого класса и я подписываюсь на событие. По событию я сразу пихаю данные на форму. Ну и само собой получаю кросспотоковую ошибку.

На данный момент решаю это проверкой контрола InvokeRequired и самим Invok`ом.

Вопрос: можно ли как-то сделать, чтобы по событию, меоды которые на него подписаны выполнялись в основном потоке, чтобы в дальнейшем при использовании этого класса не надо было заморачиваться со всеми этими Invok`ми? Т.е. как бы сделать invoke уже в самом классе.

Хочу так же обратить внимание, что этот класс будет использоваться как в WF так и в WPF. Т.е. речь о применении Invoke тут не совсем верна. (просто тестовая версия сейчас на WinForms).
...
Рейтинг: 0 / 0
Invoke event`а
    #38910009
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.Добрый день!

Не могу найти никак ответ на свой вопрос! Помогите, пожалуйста!

Есть у меня класс. Он работает с оборудованием по ком порту, общается с ним, играет в карты и пр. Иногда он дёргает event и сообщает что выиграл в карты передаёт подписчикам данные.

В главной программе у меня создаётся экземпляр такого класса и я подписываюсь на событие. По событию я сразу пихаю данные на форму. Ну и само собой получаю кросспотоковую ошибку.

На данный момент решаю это проверкой контрола InvokeRequired и самим Invok`ом.

Вопрос: можно ли как-то сделать, чтобы по событию, меоды которые на него подписаны выполнялись в основном потоке, чтобы в дальнейшем при использовании этого класса не надо было заморачиваться со всеми этими Invok`ми? Т.е. как бы сделать invoke уже в самом классе.

Хочу так же обратить внимание, что этот класс будет использоваться как в WF так и в WPF. Т.е. речь о применении Invoke тут не совсем верна. (просто тестовая версия сейчас на WinForms).

Есть в "Часто... вопросах".
Пример использования делегата, который сам себя вызывает - один раз его вызывает посторонний поток, а потом он сам себя - в главном.
...
Рейтинг: 0 / 0
Invoke event`а
    #38910010
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129 в "Часто... вопросах"..
А кстати, где они?
8-[]
...
Рейтинг: 0 / 0
Invoke event`а
    #38910017
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
7398485 - вот там есть, можно обработать чтобы всем контролам подходил.
...
Рейтинг: 0 / 0
Invoke event`а
    #38910749
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пример хороший, но я совсем не понял как этот пример решает мою задачу.

Мне из моего класса, который порождает побочный поток и из него выкидывает данные в качестве аргументов к событию, не надо менять текст на форме. Это должна делать основная программа, которая использует данный класс (в будущем это всё будет оформлено в dll).

Я хочу чтобы я/другие кто будет использовать этот класс могли просто создать объект, подписаться на событие и когда оно выстреливает обработка события происходила в основном потоке. А уж обновлять данные на форме или поступать с данными по-другому он сам будет решать. Т.е. сделать некий закрытый ящик из класса, и снять задачу Invoke при его последующем использовании.
...
Рейтинг: 0 / 0
Invoke event`а
    #38910983
petalvik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Алексей Ку.,

можно попробовать использовать методы Post/Send SynchronizationContext'а. См. здесь .

Но лучше вместо потоков использовать Task'и и TaskScheduler. Захватываем в гуевом потоке контекст синхронизации: TaskScheduler.FromCurrentSynchronizationContext и передаём его в класс.
...
Рейтинг: 0 / 0
Invoke event`а
    #38911023
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petalvik,
Интересное чтиво. Пока не очень понял как применить, но всё равно интересно.

Дело в том, что я там никакие потоки не создаю. Просто изначально у меня приходит событие от SerialPort, после чего данные преобразуются и кидаются в следующий event. Видимо мне DataReceived приходит уже из другого потока.
...
Рейтинг: 0 / 0
Invoke event`а
    #38911125
Алексей Ку.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну и у меня вообще вопрос.
Моя затея адекватна? Или стоит оставить контроле взаимодействие с UI на разработчике, использующем мои классы?
Ведь использую его он ни сном ни духом не знает какие у меня потоки порождаются и откуда он получает событие.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Invoke event`а
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]