|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
Добрый день. Задача: В главном потоке необходимо асинхронно выполнять поток команд к SQL_ю. Результат выполнения в главном потоке не нужен. Вся обработка результатов команд (успешных и нет) находится в CallBack_е. Поэтому очень важно контролировать максимальное время выполнения каждой команды. Проблема : "Свойство CommandTimeout игнорируется во время вызовов асинхронного метода, такого как BeginExecuteReader." жопное решение Код: 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.
А как правильно решить такую задачу ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 12:27 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
GreenhornА как правильно решить такую задачу ?задать таймаут на сервере? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 13:24 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
GreenhornА как правильно решить такую задачу ? Сделать синхронное выполнение запроса в асинхронном таске c заданным таймаутом. Antonariyзадать таймаут на сервере? У запросов (не транзакций) этот таймаут server-scoped. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 14:16 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныGreenhornА как правильно решить такую задачу ? Сделать синхронное выполнение запроса в асинхронном таске c заданным таймаутом. Antonariyзадать таймаут на сервере? У запросов (не транзакций) этот таймаут server-scoped. В асинхронном таске, конечно, можно. Одна беда - при синхронном выполнении запроса (в другом потоке) точно потеряем поток. А в случае асинхронного выполнения есть шанс, что поток останется в пуле потоков и будет востребован только тогда, когда запрос реально выполнится. Именно по этому я и выбрал CallBack_и ... Antonariy, какой таймаут на сервере ? "Remote Query TimeOut" ? Ну во первых - каждый запрос имеет разное значение MaxCommandTimeOut (от 5 сек. до 5 мин.) Во вторых это повлияет на всех, а не только на мою "маленькую" задачку. Еще идеи ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 14:50 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
GreenhornОдна беда - при синхронном выполнении запроса (в другом потоке) точно потеряем поток. А в случае асинхронного выполнения есть шанс, что поток останется в пуле потоков и будет востребован только тогда, когда запрос реально выполнится. С какого перепугу? Task 'и из TPL работают именно с пулом потоков: For example, beginning with the .NET Framework 4 you can create Task and Task<TResult> objects, which perform asynchronous tasks on thread pool threads. https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 14:58 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныGreenhornОдна беда - при синхронном выполнении запроса (в другом потоке) точно потеряем поток. А в случае асинхронного выполнения есть шанс, что поток останется в пуле потоков и будет востребован только тогда, когда запрос реально выполнится. С какого перепугу? Task 'и из TPL работают именно с пулом потоков: For example, beginning with the .NET Framework 4 you can create Task and Task<TResult> objects, which perform asynchronous tasks on thread pool threads. https://msdn.microsoft.com/en-us/library/0ka9477y(v=vs.110).aspx С такого перепуга, что SqlCommand.ExecuteReader() в отдельном таске и в отдельном потоке из пула потоков будет использовать этот поток, пока не отработает -> Я так думаю ! Если Вы имеете информацию об обратном - огромная просьба - поделитесь ... ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 15:23 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#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. 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.
Выхлоп Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Хотя при таком кол-ве потоков, может я на воду дую ? ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 16:28 |
|
BeginExecuteReader и CommandTimeout. Как правильно ?
|
|||
---|---|---|---|
#18+
GreenhornА вот и подтверждение того, что я прав А с чего вы взяли, что внутри Код: c# 1. 2. 3. 4. 5. 6. 7. 8.
по истечении таймаута таск уже должен отдать поток? таск еще жив, и держит этот поток. Вы вставьте вывод результата ThreadPool.GetAvailableThreads после того же ReadLine в конце теста, и посмотрите результат. ... |
|||
:
Нравится:
Не нравится:
|
|||
23.07.2015, 18:41 |
|
|
start [/forum/topic.php?fid=20&gotonew=1&tid=1401341]: |
0ms |
get settings: |
10ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
41ms |
get topic data: |
9ms |
get first new msg: |
7ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
1ms |
others: | 349ms |
total: | 483ms |
0 / 0 |