|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Здравствуйте, Коллеги! Есть поток слушающий порт, когда приходит сообщение, поток создает событие и кидает в него аргумент. Второй поток обслуживающий форму получает событие, но не может обратиться к полученному параметру. Ловлю ошибку авторВызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток. Такая ошибка возникает обычно когда к контролу из левого потока обратиться пытаешься, но там это решается при помощи invoke, а тут просто класс с данными, у него нет никакого invoke. Как же тогда передавать данные между потоками? P.S. Дело в том, что я хочу сделать отдельную библиотеку для работы с этим портом, а форма просто временная, поэтому нужно именно передавать данный от потока к потоку, а не писать данные вторым потоком прямо в форму при помощи invoke ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2013, 21:52 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12, автор поток создает событие и кидает в него аргумент авторВторой поток обслуживающий форму получает событие автор а тут просто класс с данными ничего не ясно. что за потоки что за классы, что за события.... про invoke как (передача) данных, это мелкий частный случай в контексте темы передачи, есть куча всяких вариантов например как SynchronizationContext и тд.. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2013, 22:57 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Где-то в степи, Вот код потока слушателя Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
А вот код обработчика события, который выполняется основным потоком Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
При первом же обращении к MostikServerEventArg arg происходит исключение VSВызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта является другой поток. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2013, 23:16 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12, я так и знал ((.... вот чистая рыба по вашей беде.. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2013, 23:26 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12,авторА вот код обработчика события, который выполняется основным потоком гыгы )) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.08.2013, 23:30 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12, только static delegate thread safe ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2013, 02:01 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Где-то в степи, SynchronizationContext все-таки более предназначен для взаимодействия с UI (SynchronizationContext.Current) , в других случаях лучше использовать лямбда-выражения. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2013, 18:22 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
skole, так у та и возникли проблемы с ui, или вы тоже считаете что обработчик события выполняется в основном потоке? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2013, 18:32 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
А, пардон, точно ... |
|||
:
Нравится:
Не нравится:
|
|||
11.08.2013, 20:17 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Тынц Для ленивых An extension method would generally be the way to go, since you're always going to want to perform an action on an ISynchronizeInvoke interface implementation, it's a good design choice. You can also take advantage of anonymous methods (closures) to account for the fact that you don't know what parameters to pass to the extension method; the closure will capture the state of everything needed. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
You'd then call it like this: Код: c# 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
12.08.2013, 07:57 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Где-то в степиskole, так у та и возникли проблемы с ui, или вы тоже считаете что обработчик события выполняется в основном потоке? Спасибо большое, но может посоветуете, как добиться того, чтобы событие обрабатывалось в основном потоке? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.08.2013, 10:44 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Нашел форум, где тоже обсуждалась аналогичная задача, там есть пара решений, не очень красивые на мой взгляд, но лучше чем ничего. Вот если кому нужно http://www.gotdotnet.ru/forums/3/93216/ ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2013, 14:41 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
Так что ли надо? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2013, 19:36 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12Где-то в степиskole, так у та и возникли проблемы с ui, или вы тоже считаете что обработчик события выполняется в основном потоке? Спасибо большое, но может посоветуете, как добиться того, чтобы событие обрабатывалось в основном потоке? Да никак, Вы инициализируете событие указателем на кусок кода с определенной сигнатурой, которое и исполнится в определенный момент, мало того вы в сигнатуру при вызове тащите this, то есть вы можете из обработчика изменить состояние чего то что породило событие, ( хотя и не следует это делать) , а теперь подумайте как это все хозяйство протащить в основной поток? следует акцентироваться на своих желаниях, или событие ( в классическом виде) или подать сигнал кому то, что что то произошло в потоке ( костровая почта, маршалинг, меседж, и т.д) и двигать поток дальше.., советую взять тайм аут и вернуться к истокам ( базовым знаниям) подшлифовать их честно скажу - незападло( нем мог подобрать синоним, извините) даже гуру.. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.08.2013, 23:08 |
|
Передача данных между потоками
|
|||
---|---|---|---|
#18+
palich12Нашел форум, где тоже обсуждалась аналогичная задача, там есть пара решений, не очень красивые на мой взгляд, но лучше чем ничего. Вот если кому нужно http://www.gotdotnet.ru/forums/3/93216/ Там делается все то же самое, что написал и я в прердыдущем посте, но более коряво. (В те года как я понимаю расширяющих методов не было). Я же вам написал нормально решение, для любого типа контрола, которое взято со stackoverflow.com. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.08.2013, 06:35 |
|
|
start [/forum/topic.php?fid=20&fpage=152&tid=1404208]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
51ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
1ms |
others: | 325ms |
total: | 480ms |
0 / 0 |