Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
05.05.2018, 22:21
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Добрый день. Такая ситация: есть окно - на нём создаётся пользовательский контрол (Grid, Chart, Button-ы). В конструкторе этого контрола вызывается функция, которая подгружает данные в Chart. Происходит это синхронно и не очень быстро => окно приложения зависает. Из другого потока не получается: доступ к UI-элементу не из STA-потока-ошибка. Я попробовал так: Код: 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.
И опять же - Вызывающим потоком должен быть STA. Если просто Dispatcher.BeginInvoke - то выполняется не асинхронно. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
И - вызывающим потоком должен быть STA. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 22:29
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwПроисходит это синхронно и не очень быстро => окно приложения зависает. Из другого потока не получается: доступ к UI-элементу не из STA-потока-ошибка.Стандартный подход - получить данные асинхронно в DTO (долгая операция), затем быстро перегрузить в UI-контролы в потоке UI. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 22:30
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
Либо воспользоваться паттерном MVVM - загрузить данные в модель представления, а представление само заберет изменения в нужном потоке ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 22:55
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Третий вариант - разберитесь почему данные к графику не готовы. Они не должны вычислятся. Это статистика уже прошедших событий. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:02
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Данные не вычисляются. Они добавляются на соответствующие области графика. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:03
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Что такое DTO? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:14
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwДанные не вычисляются. Они добавляются на соответствующие области графика.вопрос был почему долго. Какая разница добавляются или вытягиваются? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:28
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:28
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
|
05.05.2018, 23:29
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwфункция, которая подгружает данные в Chart.надо разделить наmraklbrwфункция, которая подгружаетиmraklbrwданные в Chart. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 12:26
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Попробовал так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
И вызываю функцию VeryLongMethod(). Выполняется не асинхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 12:36
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwИ вызываю функцию VeryLongMethod(). Выполняется не асинхронно.выполняется асинхронно, но не ждет окончания задачи, ибо async void. Вы бы почитали что-нить про работу с многопоточностью. А что касается задачи - еще раз. ДЛИТЕЛЬНУЮ операцию получения данных (что у вас там, загрузка из БД, загрузка из интернета и т.п.) нужно выполнить асинхронно (и не через async void) и сложить эти данные в DTO. А также произвести все манипуляции над ними. После этого в потоке UI присвоить все данные нужным свойствам вашего контрола. Эта операция должна быть произведена быстро, без всяких вычислений и т.п. - данные уже должны быть готовы. Тогда тормозов не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 12:41
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwПопробовал так: это монолог а не диалог. - почему у меня 1000 строк показываются быстро в таблице. А у вас медленно? На вопросы не отвечаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 12:42
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwВ конструкторе этого контрола вызывается функция, которая подгружает данные в Chart.констуктор (а вообще это неверный подход) пусть принимает на вход данные, а не загружает их сам. А по хорошему, все данные контрол должен получить через свойства, а конструктор - быть без параметров ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 12:58
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
В конструкторе контрола почти ничего не делается. Создание контрола занимает примерно до 3 сек (тоже много, да). После этого вызывается функция констрола SetQuotes, в которой уже в Chart добавляются свечи из уже готового HashSet<Candle>, т.е. данные готовы - в течении 15 секунд они (6000 свеч примерно) загружаются в Chart. Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Т.е. вот этот цикл и занимает кучу времени. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:02
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
Ужас! mraklbrw Код: c# 1.
нафига тут ElementAt? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:03
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
HashSet<Candle> - quotes[i] - так обратиться нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:04
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrw6000 свеч примерно дайте скрин свой или похожий из гугла. По 5 свечей на пиксель? ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:05
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
Почитайте, что такое Enumerator, как работает Linq и т.п. У вас проход по массиву quotes при 6000 элементах будет выполнен 6*6000 раз замените for на foreach немедленно! и никогда так больше не делайте! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:06
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrwHashSet<Candle> - quotes[i] - так обратиться нельзя.потому что вообще не надо к нему обращаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:08
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:12
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
Далее - вот это тутmraklbrw Код: c# 1.
нафига несколько раз? Что мешает сначала подготовить точку, а потом выполнять AddXY? И вообще, нельзя ли подготовить массив точек заранее (асинхронно), а потом присвоить его candleSeries.Points? (тут я не знаю, позволит ли это сделать чарт, но это было бы логично) ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:14
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
Shocker.ProПочитайте, что такое Enumerator, как работает Linq и т.п. У вас проход по массиву quotes при 6000 элементах будет выполнен 6*6000 раз замените for на foreach немедленно! и никогда так больше не делайте! Исправил, выполнение данного участка кода ~ 1-1.5 сек. Понял ошибку, действительно, было очень глупо, буду дальше смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:17
|
|||
---|---|---|---|
Асинхронная загрузка данных в Chart |
|||
#18+
mraklbrw1-1.5 сек. Тогда, я так понял, топик решён. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
|
06.05.2018, 13:22
|
|||
---|---|---|---|
|
|||
Асинхронная загрузка данных в Chart |
|||
#18+
Shocker.ProИ вообще, нельзя ли подготовить массив точек заранее (асинхронно), а потом присвоить его candleSeries.Points? (тут я не знаю, позволит ли это сделать чарт, но это было бы логично)Но даже если не позволит присвоить массив точек, все равно логично подготовить сначала массив точек вне конструктора, а в конструкторе его только добавить. Это то, о чем я твержу вам с самого начала - не надо получать данные внутри конструктора, надо их сначала подготовить, а потом грузить в контрол ... |
|||
:
Нравится:
Не нравится:
|
|||
|
|
start [/forum/topic.php?fid=21&tablet=1&tid=1440420]: |
0ms |
get settings: |
10ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
60ms |
get tp. blocked users: |
1ms |
others: | 12ms |
total: | 167ms |
0 / 0 |