对于每个请求,下面的代码都在我们的仪表板页面中运行。因此,在更新数据库值时,dependency.OnChange会触发更多次。 我们需要dependency.OnChange在我们的应用程序中只触发一次,即仅在初始页面加载时。
public List<DashboardFreezedColumns> GetDashboardFreezedColumns(int userId, string checkedEmpIds)
{
var columns = new List<DashboardFreezedColumns>();
using (var connection = new SqlConnection(_connString))
{
using (var command = new SqlCommand(sqlQuery, connection))
{
command.CommandType = CommandType.Text;
command.Notification = null;
var dependency = new SqlDependency(command);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
columns.Add(item: new DashboardFreezedColumns
{
EmployeeId = (int)reader["EmployeeId"],
Name = (string)reader["Name"],
Status = (int)reader["Status"],
Duration = (string)reader["Duration"]
});
}
}
if (connection.State == ConnectionState.Open)
connection.Close();
}
}
return columns;
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
{
MessagesHub msg = new MessagesHub();
msg.SendMessages();
}
}