void dependency_OnChange(object sender, SqlNotificationEventArgs e)
Ожидается, что вы осмотрите SqlNotificationEventArgs и увидите, о чем вас уведомили, об изменении данных или о чем-то еще. Отметьте Информация как Вставить / Обновить / Удалить . Проверьте Источник , чтобы быть Данные . Отметьте Тип как Изменить .
Скорее всего, ваш запрос незамедлительно проинформирован о том, что он не соответствует ограничениям , наложенным на уведомления о запросах . Да, я знаю, что ссылка указывает на индексированные представления, и если вы хотите понять, почему, прочитайте Таинственное уведомление .
У вас также есть состояние гонки между обновлением, ожидающим _ResetEvent, и сигнализацией обратного вызова _ResetEvent. T1 вызывает обновление. Тем временем происходит несвязанное обновление данных и вызывается обратный вызов. _ResetEvent установлен. T1 завершает обновление и ожидает _ResteEvent, о котором сообщается, поэтому оно продолжается. Вызывающая сторона предполагает, что произошел обратный вызов для собственного обновления, и кэш обновлен, но это не так.
Вторая более серьезная проблема заключается в том, что при наличии транзакций код неверен. UpdateXXX предполагает, что обратный вызов для его собственного обновления будет происходить немедленно и ждет его. Уведомление о запросе будет доставлено модулем только после фиксации обновления, поэтому при наличии TransactionScope метод UpdateXXX блокирует ожидание уведомления, которое не может быть получено до тех пор, пока UpdateXXX не вернется (живая взаимоблокировка).
Также не ясно, какова цель TrackForChanges. Вы читаете SqlDataReader (sqlCommand.ExecuteReader), но игнорируете результат. С помощью уведомлений о запросах вы отправляете запрос, читаете свой результат , и вы будете уведомлены об изменении этого результата.
И, наконец, никогда не считывает данные в обратном вызове уведомления SqlDependency .