|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Здравствуйте. Есть основная форма, которая запускается через: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
В Form1: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Если в Form1 сделать вызов Connect(), то увидим сообщение "OK". Создаем класс, чтобы убрать в него весь этот код: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
В From1 делаем Class1 a = new Class1() и не видим сообщения "OK". await connection.Invoke("название метода", объект Credentials); не приводит к срабатыванию hubProxy.On<object>("название метода", (data). Можно ли как-нибудь вызвать выполнение кода из другого класса, чтобы он работал также, как в основном? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 17:35 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Опуская тот момент, что от этого кода кровь идет из глаз, но допустим он тестовый... Зачем тут используется Invoke()? Возможно для формы, которая не показана на экране, Invoke и не должен срабатывать. Почему напрямую не вызвать MessageBox.Show? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:03 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Код тестовый.) Суть в том, что есть сторонняя библиотека, с которой идет работа именно так, если верить документации. Объявляем hubProxy.On<object>("название метода", (data), а потом вызываем метод с await connection.Invoke("название метода", объект Credentials); внутри. При этом обработчик внутри hubProxy.On должен отрабатывать. MessageBox.Show добавлен для отладки, т.к. смотреть в консоли или на контролах не очень удобно. Если бы в другом классе все работало также, то можно было бы не обращать внимания на структуру вызовов, но не работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:17 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Я не про connection.Invoke а про Form.Invoke ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:27 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Как правильно сделать, чтобы вызовы работали в любом классе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:29 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Хотя может дело не в Invoke (хотя все равно его надо убрать и убрать наследование от Form), а в этом Андрей Il В From1 делаем Class1 a = new Class1() Андрей Il Код тестовый.) ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:34 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Андрей Il Как правильно сделать, чтобы вызовы работали в любом классе? ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 18:35 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
В Form1 переменная a для Class1 глобальная. Внес изменения в вызов: Код: c# 1. 2.
Class1: Убрал public LibArgus() и изменил: Код: c# 1. 2. 3. 4. 5. 6.
Делал по примерам, но все равно не работает. Если сделать Class1 объявлением public partial class Form1 : Form, то все отрабатывает, т.к. фактически это один класс. Интересует вариант именно с разными классами. ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 21:25 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Андрей Il Внес Андрей Il Убрал Андрей Il изменил ... |
|||
:
Нравится:
Не нравится:
|
|||
10.10.2020, 22:29 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Form1: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18.
Class1: Код: 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.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 11:22 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Еще раз. Убери Form.Invoke и наследование Class1 от Form ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 11:37 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Я бы еще для чистоты эксперимента сделал вызов не в Form1_Load, а по кнопке, потому что в изначальном коде метод Connect, как я понимаю, тоже вызывается не из Form1_Load ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 11:43 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Shocker.Pro Еще раз. Убери Form.Invoke и наследование Class1 от Form Если убрать наследование от Form, то не работает Invoke в hubProxy.On<object>("...", (data) => А как по-другому сделать обработку, пока не разобрался. Shocker.Pro Я бы еще для чистоты эксперимента сделал вызов не в Form1_Load, а по кнопке, потому что в изначальном коде метод Connect, как я понимаю, тоже вызывается не из Form1_Load Вызов из Form1_Load, но кнопку добавил. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 12:56 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Так работает: Код: c# 1. 2. 3.
но является ли это правильным вариантом? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 13:08 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Андрей Il Так работает: Андрей Il но является ли это правильным вариантом? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 14:56 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Меня смущает то, что внутри блока hubProxy.On<object>("...", (data) => я не могу менять контролы Form1. В коде обратиться могу, но при смене свойства, например, "Text" код прекращает выполняться с этой строки, но ошибки не возникает. Если в режиме отладки нажать F10 на строке ...Text = "111", то в переменных будет: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления '...' не из того потока, в котором он был создан." С этим пока разбираюсь, а в остальном вариант рабочий. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 15:02 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Андрей Il Меня смущает то, что внутри блока hubProxy.On<object>("...", (data) => я не могу менять контролы Form1. Говнокод среднего характера: передай в конструктор класса Class1 ссылку на форму Form1, запомни в поле класса _form1 и вызывай _form1.Invoke() ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 15:06 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Если делать по-нормальному - надо сделать хотя бы чтобы Class1 издавал события, а Form1 их обрабатывала и меняла свои контролы. Тогда это будет нормальная отвязка класса от конкретного потребителя. Еще более нормально - работать с моделью и привязками... но разберись пока с этим. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 15:08 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
В спойлере код. Сделал событие изменения текста кнопки и текстового блока. Т.к. клик идет на кнопке, то ее название меняется, а при попытке поменять текст текстового блока получаю ту же ошибку, что объект был создан в другом потоке. Пробовал handlerFunc1 changeText делать нестатическим и передавать объект class1 из Program при создании Form1 в качестве параметра, но ситуация не меняется. Form1: Код: 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.
Class1: Код: 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.
Program: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 19:31 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Так текст меняется, но только со второго раза. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Есть ли принципиальная разница, делать событие статическим или нет? ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 19:50 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Не надо делать событие статическим Андрей Il Так текст меняется, но только со второго раза. Андрей Il Код: c# 1.
Код: c# 1. 2. 3. 4.
не надо мудрить ... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 20:30 |
|
Проблема с вызовом await Invoke из другого класса
|
|||
---|---|---|---|
#18+
Смотрел по документациям и примерам. Так работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
И так: Код: c# 1. 2. 3. 4. 5. 6. 7.
... |
|||
:
Нравится:
Не нравится:
|
|||
11.10.2020, 21:15 |
|
|
start [/forum/topic.php?fid=20&fpage=8&tid=1398460]: |
0ms |
get settings: |
8ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
36ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
64ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 158ms |
0 / 0 |