#sql-server #service-broker #sqldependency
#sql-server #service-broker #sqldependency
Вопрос:
Нормально ли, что событие SqlDependency onchange не запускается, если его поток слишком занят?
private void NotificationOnChanged(...)
{
// get database results
// simulate long process
Thread.Sleep(10000);
}
Во время сна я добавляю новую строку, и уведомление теряется по истечении времени ожидания.
Должен ли я создавать новый отдельный поток для выполнения работы и использовать флаг, чтобы определить, поступили ли новые уведомления для перезапуска ит?
Комментарии:
1. Можете ли вы опубликовать весь свой метод NotificationOnChanged? Я предполагаю, что этот метод выполняется при запуске события SqlDependency onChange?
Ответ №1:
Это поведение является артефактом реализации на ADO.net прослушиватель уведомлений. См. http://rusanu.com/2008/01/04/sqldependencyonchange-callback-timing /.
Внутренний поток SqlDependency, который отправляет ОЖИДАНИЕ (ПОЛУЧЕНИЕ), не будет отправлять другой, пока не вернется обратный вызов. Поэтому вам нужно выполнить как можно меньше обработки и вернуться в событии onChange. Определенно ничего не блокирует.
В качестве альтернативы вы можете использовать SqlNotificationRequest более низкого уровня, который позволяет вам управлять всем, включая обработку уведомлений. Но вам придется управлять всем. См. http://technet.microsoft.com/en-us/library/ms190270 (v=sql.105).aspx
Комментарии:
1. Спасибо. Я использовал потоковый шаблон потребителя производителя для быстрого возврата.