Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#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. на ф-ии GetCntReport получаю run-time error {"Существует назначенный этой команде открытый DataReader, который требуется предварительно закрыть."} что не так, не пойму заранее спасибо всем ответившим! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 22:36 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
GeneralMotors, ошибка говорит сама за себя - SqlConnection может выполнять по одной команде за раз. Т.к. переменная SQLCon у тебя не локальная, то она используется где-то еще. Скорее всего в этой же функции т.к. ты видимо создаешь несколько потоков для нее. Решение - открывать и закрывать соединение внутри функции GetCntReport или использовать открывать соединение с параметром MultipleActiveResultSets=true (это называется MARS). Кроме того в коде есть и другие проблемы: 1) ASP.NET не будет ждать завершения твоих потоков, тебе нужно вручную убеждаться что код в потоках завершился. Лучшим выбором будет ThreadPool.QueueUserWorkItem(). Но тут начинается другая проблема - ты будешь "отбирать" потоки у ASP.NET так что есть смысд увеличить максимальное кол-во рабочих потоков доступных для ASP.NET - см. справку по <processModel> . 2) lock на локальной переменной не нужен 3) вместо явного вызова Dispose() следует использовать using() { ... } 4) Пользуйся запросами с параметрами. При их использовании SQL Server сможет закешировать план исполнения, а не будет строит его заново каждый раз. Кроме того параметры защитят твое приложение от SQL Injection атак. В данном случае это не важно т.к. у тебя параметры типа int, но тем не менее. 5) С чего ты решил что многопоточность ускорит твое приложение? Где именно узкое место? Если БД, то следует начать с уменьшения кол-ва запросов, их оптимизации, попробовать кеширование результатов. Многопоточность _может_ ускорить приложение. При одном условии - грамотное применение. Раз у тебя нет опыта работы с ними, то велика вероятность наломать дров. Попробуй сначала оптимизации без использования многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.08.2012, 23:43 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
bazile, спасибо за советы! функциональность приложениея состоит в том что на основе некоего списка ID шников формируются кристаловские отчеты, сохраняющиеся потом в формате pdf и записывает эти пдф-ники в базу. Отчеты формируются в цикле поштучно. Минимум какого удалось добиться 1.2сек на один отчет - это много, потому как допустим список из 700000-8000000 шт . Запросов к БД мало, они пустяковые и выполняются за доли секунд. приведу кусок кода формирущего непосредственно отчеты, мож подскажете где можно сократить. Код: 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. 138. 139. 140. 141. 142. 143. 144. 145. 146. 147. 148. 149. 150. 151. 152. 153. 154. 155. 156. 157. 158. 159. 160. 161. 162. 163. 164. 165. 166. 167. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 09:57 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
Обязательно посмотрите в сторону тасков http://msdn.microsoft.com/ru-ru/library/system.threading.tasks.task.aspx ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 11:08 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
GeneralMotorsфункциональность приложениея состоит в том что на основе некоего списка ID шников формируются кристаловские отчеты, сохраняющиеся потом в формате pdf и записывает эти пдф-ники в базу. Это веб или desktop приложение? GeneralMotorsОтчеты формируются в цикле поштучно. Минимум какого удалось добиться 1.2сек на один отчет - это много, потому как допустим список из 700000-8000000 шт . Запросов к БД мало, они пустяковые и выполняются за доли секунд. В этом случае параллельное выполнение в самом деле поможет ускорить работу приложения. GeneralMotorsприведу кусок кода формирущего непосредственно отчеты, мож подскажете где можно сократить. Код ужасен. По сокращению советы здесь давать бессмысленно. Функцию - и скорее всего всё приложение - следует переписывать заново. Коротко пробегусь: Вместо ArrayList используй System.Collections.Generic.List<int>. Ты же не на .NET 1.x сидишь, я надеюсь? Переменная FileInfo f объявляется в самом начале, а используется в самом конце. Перенеси ее объявление к месту использования FileInfo f = new FileInfo(...) В выражении new FileInfo(MainPath + "\\file" + (_numThread - 1) + "" + curNumRep + ".pdf") лучше использовать String.Format. Это сделает код более читабельным. Кроме того для сборки путей лучше использовать Path.Combine() Для удаления файла нет нужды создавать объект FileInfo. Используй статический метод File.Delete(string) Если имя функции начинается с Get, то я ожидаю что она _вернет_ нечто. У тебя же функции GetArrayD270 и GetTemplateReport() ничего не возвращают. Похоже они меняют какие-то instance поля класса. Подобный код тяжело поддерживать. Перепиши его. Нет никакого смысла в поочередном вызове Close() и Dispose(). Они делают одно и то же. Обращение к таблицам DataSet'a по индексу плохая идея в данном случае. Судя по коду всего их 8 штук. Через неделю ты не вспомнишь где что. Используй индексатор с именем таблицы - DS.Tables["Table1"]. Это чуть медленнее, но зато нагляднее. SanSYSОбязательно посмотрите в сторону тасков Хороший совет, но автору следует начинать с изучения основ .NET в целом и C# в частности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 12:29 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
bazileSanSYSОбязательно посмотрите в сторону тасков Хороший совет, но автору следует начинать с изучения основ .NET в целом и C# в частности. Точно! Автор, купи книгу CLR via C# (Рихтер) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 13:51 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
SanSYS, информация полезная, надо почитать . Но мне не подходит - у меня FrameWork2.0 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 14:45 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
bazile, да, refactoring нужен безусловно. Только переписывать так уж чтоб бы приложение работало с нужным объемом, а не сидеть на имеющейся производительности. а для этого знаний не хватает .... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 14:49 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
GeneralMotorsТолько переписывать так уж чтоб бы приложение работало с нужным объемом, а не сидеть на имеющейся производительности. а для этого знаний не хватает .... В данном случае не согласен. Не имея базовых знаний за многопочность лучше не браться. Тебе нужно сначала отрефакторить код так чтобы функции, исполнение которых нужно распараллелить, как можно меньше (в идеале вообще) не зависели от instance переменных. Тогда переход на многопоточное выполнение пройдет более гладко. Что касается знаний, то начинай с третьего издания CLR via C# (на русском CLR via C#. Программирование на платформе Microsoft .NET Framework 4.0 на языке C# ). По многопоточности для начала прочти Threading in C# . И ты, кстати, не ответил какое у тебя приложение - ASP.NET или GUI? В данном обсуждении это имеет значение. Для веб-приложения многопоточная модель имеет свои особенности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 15:28 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
bazile, сорри, забыл, у меня обычное desctop приложение спасибо за книги, качнул ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 15:35 |
|
||
|
потоки с#, ошибка
|
|||
|---|---|---|---|
|
#18+
GeneralMotorsу меня обычное desctop приложение Тогда надо сразу в форуме WinForms, .Net Framework вопрос задавать. Попросил модераторов перенести. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.08.2012, 15:43 |
|
||
|
|

start [/forum/topic.php?fid=18&msg=37926377&tid=1359305]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
68ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
72ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 442ms |

| 0 / 0 |
