|
Асинхронная загрузка данных в 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:21 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwПроисходит это синхронно и не очень быстро => окно приложения зависает. Из другого потока не получается: доступ к UI-элементу не из STA-потока-ошибка.Стандартный подход - получить данные асинхронно в DTO (долгая операция), затем быстро перегрузить в UI-контролы в потоке UI. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 22:29 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Либо воспользоваться паттерном MVVM - загрузить данные в модель представления, а представление само заберет изменения в нужном потоке ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 22:30 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Третий вариант - разберитесь почему данные к графику не готовы. Они не должны вычислятся. Это статистика уже прошедших событий. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 22:55 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Данные не вычисляются. Они добавляются на соответствующие области графика. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:02 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Что такое DTO? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:03 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwДанные не вычисляются. Они добавляются на соответствующие области графика.вопрос был почему долго. Какая разница добавляются или вытягиваются? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:14 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:28 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:28 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwфункция, которая подгружает данные в Chart.надо разделить наmraklbrwфункция, которая подгружаетиmraklbrwданные в Chart. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.05.2018, 23:29 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Попробовал так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
И вызываю функцию VeryLongMethod(). Выполняется не асинхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 12:26 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwИ вызываю функцию VeryLongMethod(). Выполняется не асинхронно.выполняется асинхронно, но не ждет окончания задачи, ибо async void. Вы бы почитали что-нить про работу с многопоточностью. А что касается задачи - еще раз. ДЛИТЕЛЬНУЮ операцию получения данных (что у вас там, загрузка из БД, загрузка из интернета и т.п.) нужно выполнить асинхронно (и не через async void) и сложить эти данные в DTO. А также произвести все манипуляции над ними. После этого в потоке UI присвоить все данные нужным свойствам вашего контрола. Эта операция должна быть произведена быстро, без всяких вычислений и т.п. - данные уже должны быть готовы. Тогда тормозов не будет ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 12:36 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwПопробовал так: это монолог а не диалог. - почему у меня 1000 строк показываются быстро в таблице. А у вас медленно? На вопросы не отвечаете? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 12:41 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwВ конструкторе этого контрола вызывается функция, которая подгружает данные в Chart.констуктор (а вообще это неверный подход) пусть принимает на вход данные, а не загружает их сам. А по хорошему, все данные контрол должен получить через свойства, а конструктор - быть без параметров ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 12:42 |
|
Асинхронная загрузка данных в 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, 12:58 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Ужас! mraklbrw Код: c# 1.
нафига тут ElementAt? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:02 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
HashSet<Candle> - quotes[i] - так обратиться нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:03 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrw6000 свеч примерно дайте скрин свой или похожий из гугла. По 5 свечей на пиксель? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:04 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Почитайте, что такое Enumerator, как работает Linq и т.п. У вас проход по массиву quotes при 6000 элементах будет выполнен 6*6000 раз замените for на foreach немедленно! и никогда так больше не делайте! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:05 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwHashSet<Candle> - quotes[i] - так обратиться нельзя.потому что вообще не надо к нему обращаться. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:06 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:08 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Далее - вот это тутmraklbrw Код: c# 1.
нафига несколько раз? Что мешает сначала подготовить точку, а потом выполнять AddXY? И вообще, нельзя ли подготовить массив точек заранее (асинхронно), а потом присвоить его candleSeries.Points? (тут я не знаю, позволит ли это сделать чарт, но это было бы логично) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:12 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Shocker.ProПочитайте, что такое Enumerator, как работает Linq и т.п. У вас проход по массиву quotes при 6000 элементах будет выполнен 6*6000 раз замените for на foreach немедленно! и никогда так больше не делайте! Исправил, выполнение данного участка кода ~ 1-1.5 сек. Понял ошибку, действительно, было очень глупо, буду дальше смотреть. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:14 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrw1-1.5 сек. Тогда, я так понял, топик решён. Удачи! ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:17 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Shocker.ProИ вообще, нельзя ли подготовить массив точек заранее (асинхронно), а потом присвоить его candleSeries.Points? (тут я не знаю, позволит ли это сделать чарт, но это было бы логично)Но даже если не позволит присвоить массив точек, все равно логично подготовить сначала массив точек вне конструктора, а в конструкторе его только добавить. Это то, о чем я твержу вам с самого начала - не надо получать данные внутри конструктора, надо их сначала подготовить, а потом грузить в контрол ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:22 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#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.
До вызова chartG1.SetQuotes(quotes) всё выполняется почти мгновенно (хотя да, есть считывание котировок с файла). Но мы же не можем грузить котировки по всем доступным инструментам предварительно в память? chartG1.SetQuotes(quotes) - занимает несколько секунд в совокупности. Тут добавляются точки на график, рассчитываеются min, max - корректирование визуального отображения графика. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:47 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Конструктор вы не показываете, ладно, фиг с ним. SetQuotes вы показали лишь частично. Если в остальном такой же говнокод, как в случае с ElementAt, то неудивительно. Коллекцию точек с большой вероятностью, можно подготовить заранее, вне SetQuotes и вне UI-потока ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 13:54 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
И всё-таки, пробую сделать асинхронным подготовку контрола. Код: c# 1. 2. 3. 4.
Вызываю: Код: c# 1. 2.
Окно появляется быстро, но зависает, пока выполяется функция AddChart(). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:38 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:40 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwИ всё-таки, пробую сделать асинхронным подготовку контрола.Блин, учите матчасть. Что толку от Invoke, если тупящий код выполняется в UI-потоке? UI при этом всё равно остановится. Вам говорят как надо, вы упорно пытаетесь съесть кактус ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:45 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
говнокод на маршеmraklbrw Код: c# 1.
зачем эту операцию выполнять 6000 раз? mraklbrw Код: c# 1.
а это что, нельзя было заранее подготовить в виде строки, а не вычислять в UI-потоке? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:48 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrw Код: c# 1.
тут-то не смогли тормозов добавить, надеюсь? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:51 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwИ всё-таки, пробую сделать асинхронным подготовку контрола. )) упрямый. Втыкает асинхронность и потоки там где они не нужны. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 14:56 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83.
С вычислением цветов исправил, спасибо. В данный момент: сделал кнопку - при нажатии - вызов AddChart() ~ 2 секунды, из них ~ 300-350ms - загрузка котировок из файла. Проверьте, пожалуйста, код в ReadQuotes(). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 15:05 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrw Код: c# 1.
Это что за бред? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 15:25 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Код: 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, 15:28 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Во-первых, в Linq есть агрегатные функции, зачем их имитировать? Впрочем тут может и есть смысл, чтобы сделать один проход вместо двух. Во-вторых, HashSet не является коллекцией с детерминированной последовательностью элементов (сами же писали, что обращение по индексу к ней невозможно), следовательно позиционные операции с ним логического смысла не имеют ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 15:33 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Определения класса Candle вы не дали, поэтому смысл применения хэшсета вообще не очевиден. Объясните словами, зачем он применён. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 15:38 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Candle - тут пока всё плохо с кодом Код: 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. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106. 107. 108. 109. 110. 111. 112. 113. 114. 115. 116. 117. 118. 119. 120. 121. 122. 123. 124. 125. 126. 127. 128. 129. 130. 131. 132. 133. 134. 135. 136. 137.
HashSet - возможны ситуации, когда какая-то часть от загружаемых данных (допустим, процентов 5-7-10) иногда может повторяться, поэтому для того, чтобы не было повторяющихся данных. Иначе каждый раз проверять данные считываемые. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 16:52 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
mraklbrwможет повторяться, поэтому для того, чтобы не было повторяющихся данных.ну ок, но из-за этого вы теряете порядок следования элементов ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 17:21 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Да вроде на графике всё нормально выводится. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 17:25 |
|
Асинхронная загрузка данных в Chart
|
|||
---|---|---|---|
#18+
Ну значит либо график сортирует сам, либо из-за того, что Код: c# 1. 2. 3. 4.
значения, отсортированные по хэшу, оказываются в нужной последовательности. Но так делать нельзя. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.05.2018, 17:32 |
|
|
start [/forum/topic.php?all=1&fid=21&tid=1440420]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
162ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
74ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 299ms |
0 / 0 |