|
Invoke event`а
|
|||
---|---|---|---|
#18+
Добрый день! Не могу найти никак ответ на свой вопрос! Помогите, пожалуйста! Есть у меня класс. Он работает с оборудованием по ком порту, общается с ним, играет в карты и пр. Иногда он дёргает event и сообщает что выиграл в карты передаёт подписчикам данные. В главной программе у меня создаётся экземпляр такого класса и я подписываюсь на событие. По событию я сразу пихаю данные на форму. Ну и само собой получаю кросспотоковую ошибку. На данный момент решаю это проверкой контрола InvokeRequired и самим Invok`ом. Вопрос: можно ли как-то сделать, чтобы по событию, меоды которые на него подписаны выполнялись в основном потоке, чтобы в дальнейшем при использовании этого класса не надо было заморачиваться со всеми этими Invok`ми? Т.е. как бы сделать invoke уже в самом классе. Хочу так же обратить внимание, что этот класс будет использоваться как в WF так и в WPF. Т.е. речь о применении Invoke тут не совсем верна. (просто тестовая версия сейчас на WinForms). ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2015, 15:05 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
Алексей Ку.Добрый день! Не могу найти никак ответ на свой вопрос! Помогите, пожалуйста! Есть у меня класс. Он работает с оборудованием по ком порту, общается с ним, играет в карты и пр. Иногда он дёргает event и сообщает что выиграл в карты передаёт подписчикам данные. В главной программе у меня создаётся экземпляр такого класса и я подписываюсь на событие. По событию я сразу пихаю данные на форму. Ну и само собой получаю кросспотоковую ошибку. На данный момент решаю это проверкой контрола InvokeRequired и самим Invok`ом. Вопрос: можно ли как-то сделать, чтобы по событию, меоды которые на него подписаны выполнялись в основном потоке, чтобы в дальнейшем при использовании этого класса не надо было заморачиваться со всеми этими Invok`ми? Т.е. как бы сделать invoke уже в самом классе. Хочу так же обратить внимание, что этот класс будет использоваться как в WF так и в WPF. Т.е. речь о применении Invoke тут не совсем верна. (просто тестовая версия сейчас на WinForms). Есть в "Часто... вопросах". Пример использования делегата, который сам себя вызывает - один раз его вызывает посторонний поток, а потом он сам себя - в главном. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2015, 15:23 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
D129 в "Часто... вопросах".. А кстати, где они? 8-[] ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2015, 15:25 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
7398485 - вот там есть, можно обработать чтобы всем контролам подходил. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.03.2015, 15:29 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
Пример хороший, но я совсем не понял как этот пример решает мою задачу. Мне из моего класса, который порождает побочный поток и из него выкидывает данные в качестве аргументов к событию, не надо менять текст на форме. Это должна делать основная программа, которая использует данный класс (в будущем это всё будет оформлено в dll). Я хочу чтобы я/другие кто будет использовать этот класс могли просто создать объект, подписаться на событие и когда оно выстреливает обработка события происходила в основном потоке. А уж обновлять данные на форме или поступать с данными по-другому он сам будет решать. Т.е. сделать некий закрытый ящик из класса, и снять задачу Invoke при его последующем использовании. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 10:47 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
Алексей Ку., можно попробовать использовать методы Post/Send SynchronizationContext'а. См. здесь . Но лучше вместо потоков использовать Task'и и TaskScheduler. Захватываем в гуевом потоке контекст синхронизации: TaskScheduler.FromCurrentSynchronizationContext и передаём его в класс. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 12:30 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
petalvik, Интересное чтиво. Пока не очень понял как применить, но всё равно интересно. Дело в том, что я там никакие потоки не создаю. Просто изначально у меня приходит событие от SerialPort, после чего данные преобразуются и кидаются в следующий event. Видимо мне DataReceived приходит уже из другого потока. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 12:50 |
|
Invoke event`а
|
|||
---|---|---|---|
#18+
Ну и у меня вообще вопрос. Моя затея адекватна? Или стоит оставить контроле взаимодействие с UI на разработчике, использующем мои классы? Ведь использую его он ни сном ни духом не знает какие у меня потоки порождаются и откуда он получает событие. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.03.2015, 14:15 |
|
|
start [/forum/topic.php?fid=20&fpage=91&tid=1401779]: |
0ms |
get settings: |
8ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
40ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 144ms |
0 / 0 |