У меня есть следующий фрагмент кода, который запускает «выбрать» на определенную таблицу, которая должна контролироваться каждые 200 милисекундТаймер с автосбросом вызывает System.OutOfMemoryException
timerMonitoreoOrdenes = new System.Timers.Timer(FRECUENCIA_MONITOREO_ORDENES);
timerMonitoreoOrdenes.Elapsed += new ElapsedEventHandler(timerMonitoreoOrdenes_Elapsed);
timerMonitoreoOrdenes.Enabled = true;
timerMonitoreoOrdenes.AutoReset = true;
В timerMonitoreoOrdenes_Elapsed
методе я бегу хранимая процедура, которая возвращает DataSet и для каждой строки, я создаю новый объект, который хранится в памяти Queue
программа предназначена для быть запущенно все время (как сервис Windows), но после того, как программа работает для Несколько часов я получаю это исключение
System.OutOfMemoryException:
in System.Threading.ExecutionContext.CreateCopy()
in System.Threading._TimerCallback.PerformTimerCallback(Object state)
Причина, по которой я делаю это, как это Becase есть внешняя программа, которая вставляет записи в БД со статусом = 0, и мне нужно, чтобы получить эти записи, процесс их и установить статус = 1 , Есть некоторые темы, которые принимают записи из очереди
Важно отметить, что это для приложения РЕАЛЬНОГО ВРЕМЕНИ-ТРЕЙДИНГ, что 1 вторая задержка информации слишком высока
- Я хочу знать, возникает ли исключение System.OutOfMemoryException из-за автосекретаря таймера?
- Должен ли я создать Thread или использовать Thread.Sleep вместо Timer для проверки определенных записей, которые были вставлены другим процессом?
Ну, вы описали, как вы помещаете данные из своего DataSet в очередь, но ни в коем случае не предлагаете вам что-либо выходить из очереди.Другая мысль, которая возникает, заключается в том, что если SQL-запрос занимает в среднем более 200 мс, тогда вы столкнетесь с множеством проблем. Более подробная информация о том, что вы делаете, прежде чем дать ответ. А также, возможно, почему вы это делаете, поскольку может быть лучшее решение вашей исходной проблемы, чем обычные выборки в таблице БД. – Chris
@Chris Я добавил дополнительную информацию к вопросу. Если вам нужна дополнительная информация, я могу предоставить их. –
Сверху моей головы. Я не помню, чтобы сам System.Timers.Timer мешал повторному вводу обратного вызова. Может быть, ваш обратный вызов снова вызван до завершения предыдущего вызова? Что произойдет, если вы отключите таймер из обратного вызова, чтобы этого не произошло? –