我们正在使用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。
答案 0 :(得分:0)
在更新GUI之前,您应该注册新的SqlDependency。这样,无论在此期间发生了多少变化,您都将始终拥有最新状态。