SqlDependency - 阻止事件之间的数据转换并再次重新注册Query?

时间:2015-01-15 09:21:41

标签: c# wpf sql-server-2008-r2 sqldependency

我们正在使用SqlDependencies开发WPF应用程序,以根据数据库更新应用程序。我们已经认识过几次,查询通知似乎是不规则的 - 应用程序没有显示数据库的最新状态。一旦其他人在桌面上进行了更改,应用程序就会快速更新并显示最新状态。

我现在编写了一个工具,它只是在特定时间内尽可能快地更改数据库,另一个工具用于注册SqlDependencies并只计算触发了多少个SqlDependencies。

private void AddNewQuery(string query)
{
  using (var connection = new SqlConnection(_connectionString))
  {
    connection.Open();
    var command = new SqlCommand(query, connection);
    var dependency = new SqlDependency(command);

    dependency.OnChange += OnQueryChanged;
  }
}

private void OnQueryChanged(object sender, SqlNotificationEventArgs e)
{
  AddNewQuery('SELECT Foo,Bar FROM dbo.Foobar');      
  OnDatabaseChanged();
  var dependency = sender as SqlDependency;
  dependency.OnChange -= OnQueryChanged;
}

private void OnDatabaseChanged()
{
  lock(_databaseChangedLocker)
    _counter++;
}

显然,主应用程序运行得越快,SqlDependency-Reader识别的通知就越少。例如:我已经运行了几次1000次查询:

9.2秒总运行时间导致收到520个通知(52%) 14秒总运行时间导致822通知(82.2%) 19.3秒的总运行时间导致957个通知(95.7%)。

有没有办法阻止这种数据压缩并确保每次更改都会导致QueryNotification?我们正在运行SQL Server 2008 R2。

1 个答案:

答案 0 :(得分:0)

在更新GUI之前,您应该注册新的SqlDependency。这样,无论在此期间发生了多少变化,您都将始终拥有最新状态。