|
Не удается организовать новый поток
|
|||
---|---|---|---|
#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.
Хотелось бы вынести заполнение в новый поток. Но при попытке сделать так внутри класса: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вылетает исключение: "Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher." Почитал, что надо использовать Dispatcher.Invoke. Подскажите, пожалуйста, как правильно обернуть данный фрагмент кода Dispatcher.Invoke? ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2017, 13:59 |
|
Не удается организовать новый поток
|
|||
---|---|---|---|
#18+
orac0olДобрый день. У меня есть класс для работы с файлами. В какой-то момент я заполняю коллекцию данными файлов из указанной директории. Код: 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.
Хотелось бы вынести заполнение в новый поток. Но при попытке сделать так внутри класса: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
Вылетает исключение: "Данный тип CollectionView не поддерживает изменения в своем SourceCollection из потока, отличного от потока Dispatcher." Почитал, что надо использовать Dispatcher.Invoke. Подскажите, пожалуйста, как правильно обернуть данный фрагмент кода Dispatcher.Invoke? самый просто путь, это в многопоточности грузить то, что вам надо в 1 коллекцию, не связанную с интерфейсом, либо каждый поток грузит свою коллекцию в конце, когда все загрузилось объединить и вставить в основном потоке ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2017, 14:58 |
|
Не удается организовать новый поток
|
|||
---|---|---|---|
#18+
Roman Mejtes, а не могли бы вы привести хотя бы обобщенный вариант вашего решения касательно моего случая? Просто не совсем понятно, что вы имели в виду ... |
|||
:
Нравится:
Не нравится:
|
|||
25.11.2017, 16:22 |
|
Не удается организовать новый поток
|
|||
---|---|---|---|
#18+
orac0olХотелось бы вынести заполнение в новый поток. Цель? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 14:03 |
|
Не удается организовать новый поток
|
|||
---|---|---|---|
#18+
orac0ol, Invoke это 26 мкс на вызов. Т.е. если на каждое фото, то может тормозить. А может и нет. Лучше показывай штук 300 маленьких. Ищи компроиисс. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 15:04 |
|
Не удается организовать новый поток
|
|||
---|---|---|---|
#18+
в данный момент я вижу, что у вас метод просто читает названия файлов в коллекцию. Данная операция, если там не 100500 файлов выполняется очень быстро, на столько, что делать это в отдельном потоке не имеет смысла. А вообще переходите на async\await и Task'и из TPL Но вот вам пример, для затравки (это только пример, многие классы тут написаны на коленке за пару минут): Данный пример не претендует на Best Practics. Код: 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.
Код: xml 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.
Так же, из другого потока можно вызвать код через Dispatcher. Получить Dispatcher UI контекста можно через класс Application Код: c# 1.
Полностью, это будет выглядеть вот так: Application.Current.Dispatcher.Invoke(() => Тут пишем код, который будет вызывать из основного потока, DispatcherPriority.Normal); Приоритет определяет когда будет вызван метод, на каком этапе работы диспатчера. После биндинга, после загрузки, когда приложение будет простаивать и т.д. Почитай про то, что такое асинхронный\синхронный вызов, про многопоточность, TPL, async\await и что такое синхронизация в многопоточной среде, а потом приходите сюда с такими вопросами. Пока не прочитаете, лучше делайте всё синхронно. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.11.2017, 15:22 |
|
|
start [/forum/topic.php?fid=21&fpage=7&tid=1440470]: |
0ms |
get settings: |
10ms |
get forum list: |
17ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 184ms |
0 / 0 |