временно приостановить уведомление sqldependency для обновления

У меня есть запрос SELECT, который я отслеживаю с помощью SQLDependency. Все работает нормально, но я хотел бы временно приостановить зависимость, пока я делаю ОБНОВЛЕНИЕ для набора данных, который отслеживает запрос, который, как я знаю, вызовет уведомление об изменении из базы данных.

В настоящее время я устанавливаю флаг, который отмечает тот факт, что я выполняю обновление, позволяю зависимости сработать, а затем сбрасываю ее, чтобы продолжить мониторинг запроса.

Должен быть более элегантный способ сделать это.


person Jon Boede    schedule 06.02.2015    source источник
comment
Не могли бы вы остановить прослушиватель и запустить его после обновления?   -  person Rhys Jones    schedule 06.02.2015


Ответы (1)


Будьте осторожны при использовании класса SqlDependency — он имеет проблемы с утечками памяти. Однако вы можете использовать реализацию класса SqlDependency с открытым исходным кодом — SqlDependencyEx. Он использует триггер базы данных и собственное уведомление Service Broker для получения событий об изменениях таблицы. Это пример использования:

int changesReceived = 0;
using (SqlDependencyEx sqlDependency = new SqlDependencyEx(
          TEST_CONNECTION_STRING, TEST_DATABASE_NAME, TEST_TABLE_NAME)) 
{
    sqlDependency.TableChanged += (o, e) => changesReceived++;
    sqlDependency.Start();

    // Make table changes.
    MakeTableInsertDeleteChanges(changesCount);

    // Wait a little bit to receive all changes.
    Thread.Sleep(1000);
}

Assert.AreEqual(changesCount, changesReceived);

С помощью SqlDependecyEx вы можете отслеживать только INSERT или DELETE, избегая UPDATE. Надеюсь это поможет.

person dyatchenko    schedule 23.02.2015