Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть некоторый сервис (Windows Service), построенный по след. принципу: в методе OnStart устанавливается bool переменная is_work в true далее по событию Elapsed таймера вызывается функция, которая открывает сокет и пока is_work = true читает из сокета данные (в синхронном режиме) и складываются в БД. При остановке сервиса is_work устанавливается в false и соответственно чтение прекращается, соединения закрываются. Вопрос: подходит ли такая организация работы для подобной задачи? или принято делать как-то иначе? выгоднее ли (по любому параметру) использовать асинхронные сокеты? если выгоднее, то как реализовать в данном контексте асинхронное чтение? Собственно что не устраивает в текущем режиме работы: при недоступности сервера (ребут например) соединение не разрывается. То есть данные просто перестают поступать из сокета. Надо чтобы это отслеживалось и сокет создавался заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 17:35 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Лучше создавать отдельный thread и читать данные в нем асинхронно: Код: plaintext 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. -- WBR, Roman S. Golubin ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 17:58 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
у меня вопрос: для чего сдесь асинхронность:? Код: plaintext 1. 2. и еще, может так будет лучше? Код: plaintext 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 09.12.2004, 19:01 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Лиман Артёму меня вопрос: для чего сдесь асинхронность:? Код: plaintext 1. 2. Данный кусок кода был приведен как пример ухода от переменной bool is_work. Странно, что Read вместо Receive тебя не смутило :-) Лиман Артём и еще, может так будет лучше? Код: plaintext 1. 2. 3. 4. Ну да. Извините. Люди над душой стояли - домой звали... :-\ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 01:13 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Ну и раз уж начали исправлять то что написано выше, то добавлю еще: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 01:20 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Лиман Артёму меня вопрос: для чего сдесь асинхронность:? Код: plaintext 1. 2. Блин. Я аж сам задумался - почему-то все время так пишу :-) При использовании Receive есть проблема с завершением thread при использовании просто Receive. Проблема такого плана, что пока соединение не разорвано принудительно удаленным хостом и при этом удаленный хост не отправляет ни каких данных, thread не может завершиться (даже Thread.IsBackground = true не поможет :-)) и продолжает выполнять Receive. В приведенном же мной примере при Thread.Abort thread сразу же вываливается с исключением ThreadAbortException. PS: Даже не знаю - баг это или фича такая ;-)) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 10:42 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Roman S. GolubinНу и раз уж начали исправлять то что написано выше, то добавлю еще: Код: plaintext 1. Спасибо всем за помощь! Только вот на строчку выше компилятор ругался: Static member 'System.Threading.Thread.Sleep(int)' cannot be accessed with an instance reference; qualify it with a type name instead Когда изменил на Thread.Sleep(0); - замолчал ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.12.2004, 11:06 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Кстати! проблема так и не исчезла: notariusСобственно что не устраивает в текущем режиме работы: при недоступности сервера (ребут например) соединение не разрывается. То есть данные просто перестают поступать из сокета. Надо чтобы это отслеживалось и сокет создавался заново. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2004, 11:20 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Смотри пример - специально для тебя написал :-) Код: plaintext 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2004, 17:03 |
|
||
|
Сокеты
|
|||
|---|---|---|---|
|
#18+
Да, совсем забыл. Самое главное. В GetConnectedSocket установи опцию сокета ReceiveTimeout в ненулевое значение. socket.SetSocketOption (SocketOptionLevel.Socket, SocketOptionName.SendTimeout, XXXX); XXXX - время ожидания данных от сервера, после которого должно произойти исключение SocketException, которое попытается установить новое соединение. PS: Да. И еще - прежде чем создавать новое соединение надо бы старое прибивать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2004, 17:50 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=32822546&tid=1437649]: |
0ms |
get settings: |
6ms |
get forum list: |
12ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
42ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 217ms |
| total: | 320ms |

| 0 / 0 |
