SqlDependency — не запускается во время занятости

#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. Спасибо. Я использовал потоковый шаблон потребителя производителя для быстрого возврата.