![]() |
|
Модераторы: Partizan, gambit |
![]()
|
|
| Zhenyok |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.10.2006 Репутация: нет Всего: нет |
Доброго времени суток. Пишу сервер на c#(многопоточный, общается через TCP с драйверами), столкнулся с такой проблемой: остановливаются таймеры(System.Timers), то один ,то другой, то через пару часов, то через месяц.
Вот код таймеров посылки тестовых команд драйверам(у них AutoReset = true)
в SendTestCommand() выполняется socket.BeginSend код таймера для работы с ключем AutoReset = false
где CheckHaspStatus() проверяет состояние ключа. Все вроде безобидно, но в чем дело - никак не пойму Думал что еще виноват GC, он приостанивливает на время чистки, так нет, делал тесты заполнял все кучи, GC с ума сходил, но все работало, да и по логам ситуация другая(сообщения сбиваются, таймеры время пропускают, очередь смешивается) В моей же ситуации все четко, просто таймер останавливается. Еще подозрения падали на загруженность процессора - тоже не то(делал тесты) Общих ресурсов нет, deadlock-а тоже. Главное не на всех машинах падает, а только на сервере фирмы Может из-за конфигурации системы, или hyper threading-а Приложение компилировалось на MSVS2003, на сервере стоит framework 1 Может кто знает в чем причина подскажите хоть в какую сторону рыть, а то уже голова скоро лопнет |
||||
|
|||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
Socket.EndSend() когда вызывается?
И код давай сюда. Иначе никто не ответит. -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Zhenyok |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.10.2006 Репутация: нет Всего: нет |
вот метод
а вот метод SendCallBack
Вот функции приема данных
вот методы чтения и записи в сокет Добавлено через 35 секунд все что есть |
||||||
|
|||||||
| ivashkanet |
|
|||
![]() Кодю потиху ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3684 Регистрация: 23.2.2006 Где: Гомель, Беларусь Репутация: 47 Всего: 149 |
А эксепшин не может здесь выскочить? |
|||
|
||||
| Zhenyok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.10.2006 Репутация: нет Всего: нет |
была такая теория, тестировал порождением нового exception, бесполезно, проглатывает его, т.к. метод выполняется в системном потоке.
Но теория не подтвердилась |
|||
|
||||
| tol05 |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1632 Регистрация: 21.12.2006 Где: Харьков Репутация: 63 Всего: 170 |
ИМХО если просто останавливаются таймеры, то это значит, что их в очередной раз просто не запустили. Поэтому я согласен с ivashkanet
(ivashkanet, блин, твой новый аватар просто крышу рвет) Нужно искать в CheckHaspStatus() Значит все-таки в ней валится... Это сообщение отредактировал(а) tol05 - 18.12.2007, 15:45 -------------------- На хорошей работе и сны хорошие снятся. |
|||
|
||||
| Zhenyok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.10.2006 Репутация: нет Всего: нет |
вот лог, где ясно видно, что haspTimer был взведен, но не выполнтлся, а функция отработала корректно
8:17:21.62 TestCommandTimerCallback work 24 all 1000 8:17:21.62 SOCKET 0: TestCommand timer elapsed 8:17:21.62 SOCKET 0: Begin send test command 8:17:21.62 SOCKET 0: SendTestCommand called 8:17:21.62 SOCKET 0: End send test command 8:17:21.62 TestCommandTimerCallback work 24 all 1000 8:17:21.62 SOCKET 1: TestCommand timer elapsed 8:17:21.62 SOCKET 1: Begin send test command 8:17:21.62 SOCKET 1: SendTestCommand called 8:17:21.62 SOCKET 1: End send test command 8:17:21.62 TestCommandTimerCallback work 24 all 1000 8:17:21.62 SOCKET 2: TestCommand timer elapsed 8:17:21.62 SOCKET 2: Begin send test command 8:17:21.62 SOCKET 2: SendTestCommand called 8:17:21.62 SOCKET 2: End send test command 8:17:21.62 ReceiveCallback work 25 all 999 8:17:21.62 ReceiveCallback work 25 all 999 8:17:21.78 haspTimer_Elapsed start haspTimerStoped = False 8:17:21.78 HaspTimer.Stop() haspTimerStoped = False 8:17:21.78 work 24 all 1000 8:17:21.78 Hasp status: 1 StatusOk 8:17:21.109 ReceiveCallback work 24 all 999 8:17:21.125 Hasp status: 2 StatusOk 8:17:21.125 Hasp status: 3 StatusOk 8:17:21.140 Hasp status: 4 StatusOk 8:17:21.140 Hasp status 5 : StatusOk 8:17:21.140 Hasp status: 6 StatusOk 8:17:21.140 Hasp status: 7 StatusOk 8:17:21.140 hasp return True 8:17:21.140 CheckHaspStatus()1 = true buffermanStopedByHasp = False 8:17:21.140 End HaspTimer_Elapsed haspTimer.Enabled = True 14.12.2007 8:17:22.125 ReceiveCallback work 25 all 999 8:17:22.125 ReceiveCallback work 25 all 999 8:17:22.125 TestCommandTimerCallback work 24 all 1000 8:17:22.125 SOCKET 0: TestCommand timer elapsed 8:17:22.125 SOCKET 0: Begin send test command 8:17:22.125 SOCKET 0: SendTestCommand called 8:17:22.125 SOCKET 0: End send test command 8:17:22.125 TestCommandTimerCallback work 24 all 1000 8:17:22.125 SOCKET 1: TestCommand timer elapsed 8:17:22.125 SOCKET 1: Begin send test command 8:17:22.125 SOCKET 1: SendTestCommand called 8:17:22.125 SOCKET 1: End send test command 8:17:22.125 TestCommandTimerCallback work 24 all 1000 8:17:22.125 SOCKET 2: TestCommand timer elapsed 8:17:22.140 SOCKET 2: Begin send test command 8:17:22.140 SOCKET 2: SendTestCommand called 8:17:22.140 SOCKET 2: End send test command 8:17:22.140 haspTimer_Elapsed start haspTimerStoped = False 8:17:22.140 HaspTimer.Stop() haspTimerStoped = False 8:17:22.140 work 24 all 1000 8:17:22.140 Hasp status: 1 StatusOk 8:17:22.140 ReceiveCallback work 24 all 999 8:17:22.187 Hasp status: 2 StatusOk 8:17:22.187 Hasp status: 3 StatusOk 8:17:22.203 Hasp status: 4 StatusOk 8:17:22.203 Hasp status 5 : StatusOk 8:17:22.203 Hasp status: 6 StatusOk 8:17:22.203 Hasp status: 7 StatusOk 8:17:22.203 hasp return True 8:17:22.203 CheckHaspStatus()1 = true buffermanStopedByHasp = False 8:17:22.203 End HaspTimer_Elapsed haspTimer.Enabled = True 14.12.2007 8:17:23.140 ReceiveCallback work 25 all 999 8:17:23.140 ReceiveCallback work 25 all 999 8:17:23.140 TestCommandTimerCallback work 24 all 1000 8:17:23.140 SOCKET 0: TestCommand timer elapsed 8:17:23.140 SOCKET 0: Begin send test command 8:17:23.140 SOCKET 0: SendTestCommand called 8:17:23.140 SOCKET 0: End send test command 8:17:23.140 TestCommandTimerCallback work 24 all 1000 8:17:23.140 SOCKET 1: TestCommand timer elapsed 8:17:23.140 SOCKET 1: Begin send test command 8:17:23.140 SOCKET 1: SendTestCommand called 8:17:23.140 SOCKET 1: End send test command 8:17:23.140 TestCommandTimerCallback work 24 all 1000 8:17:23.140 SOCKET 2: TestCommand timer elapsed 8:17:23.140 SOCKET 2: Begin send test command 8:17:23.140 SOCKET 2: SendTestCommand called 8:17:23.203 SOCKET 2: End send test command 8:17:23.218 ReceiveCallback work 25 all 999 14.12.2007 8:17:24.156 TestCommandTimerCallback work 24 all 1000 8:17:24.156 SOCKET 0: TestCommand timer elapsed 8:17:24.156 SOCKET 0: Begin send test command 8:17:24.156 SOCKET 0: SendTestCommand called 8:17:24.156 SOCKET 0: End send test command 8:17:24.156 TestCommandTimerCallback work 24 all 1000 8:17:24.156 SOCKET 1: TestCommand timer elapsed 8:17:24.156 SOCKET 1: Begin send test command 8:17:24.156 SOCKET 1: SendTestCommand called 8:17:24.156 SOCKET 1: End send test command 8:17:24.156 TestCommandTimerCallback work 24 all 1000 8:17:24.156 SOCKET 2: TestCommand timer elapsed 8:17:24.156 SOCKET 2: Begin send test command 8:17:24.156 SOCKET 2: SendTestCommand called 8:17:24.156 SOCKET 2: End send test command 8:17:24.156 ReceiveCallback work 25 all 999 8:17:24.156 ReceiveCallback work 25 all 999 8:17:24.281 ReceiveCallback work 25 all 999 я бы понял если там исключение, так нет же, не вылетает !!! |
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
В крайнем случае можно вместо Start/Stop попробовать юзать булевский флаг:
Вообще не очень понятно, почему используется Start/Stop и почему AutoReset=true... -------------------- ![]() |
|||
|
||||
| Zhenyok |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 19.10.2006 Репутация: нет Всего: нет |
флаг можно использовать-не вопрос, я пытаюсь понять почему таймер в следующую секунду не запустился, хотя при выходе из haspTimer_Elapsed hasrTimer.Enabled = true, т.е. оп определению он должен сработать!!! А он не сработал. Есть ли какие-нить предпосылки для этого? Дело в системе или коде? Почему тогда на некоторых компах работает всегда, а на некоторых падает
|
|||
|
||||
| mr.DUDA |
|
|||
|
3D-маньяк ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8244 Регистрация: 27.7.2003 Где: город-герой Минск Репутация: 110 Всего: 232 |
Код странный. Во-первых, несколько обработчиков Elapsed могут выполниться одновременно т.к. таймер использует пул потоков для генерации события Elapsed. Во-вторых, AutoReset говорит о том что Elapsed будет выкинут 1 раз после Start. В-третьих, Start/Stop в каждом обработчике Elapsed... Наконец, не мешало бы поставить try..catch на метод CheckHaspStatus.
-------------------- ![]() |
|||
|
||||
![]()
|
| Прежде чем создать тему, посмотрите сюда: | |
|
|
Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов. Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :) Так же не забывайте отмечать свой вопрос решенным, если он таковым является :) Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |