我正在使用带有SQLDependency的SignalR来在SQL Server数据库中的某个表中发生更改时收到通知。 通知工作正常 - 但我看到一个问题。由于数据库中的更改越来越多,SignalR会在数据库中进行单个更改时触发多个客户端中心事件。
看着控制台,我得到了以下内容:
[格林威治标准时间-0700(太平洋夏令时间)16:32:30] SignalR:在集线器'MessangerHub'上触发客户端集线器事件'sendMessage'。
[格林威治标准时间-0700(太平洋夏令时间)16:32:30] SignalR:在集线器'MessangerHub'上触发客户端集线器事件'sendMessage'。 ...
看起来事件被多次触发。 任何帮助将不胜感激。
public IEnumerable<Internal.Core.Model.ShipmentStatusInfo> GetShipments(DateTime lastStatusUpdatedDate)
{
using (var conn = new SqlConnection(Config.Instance.ShipmentConnection))
{
conn.Open();
var q = "SELECT dbo.Shipment.ShipmentID, dbo.Shipment.[STATUS], dbo.Shipment.[LAST_MODIFIED_DATE] "+
" FROM dbo.Shipment WHERE name like @name and [Shipment].[LAST_MODIFIED_DATE] > @date";
using (var cmd = new SqlCommand(q, conn))
{
cmd.Parameters.Add("@date", SqlDbType.DateTime).Value = lastStatusUpdatedDate;
cmd.Parameters.Add("@name", SqlDbType.VarChar).Value = Config.Instance.Name;
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (conn.State == ConnectionState.Closed)
{
conn.Open();
}
using (var reader = cmd.ExecuteReader())
{
return reader.Cast<IDataRecord>().Select(x => new Internal.Core.Model.ShipmentStatusInfo()
{
ShipmentId = x.GetString(0),
Status = x.GetString(1)
}).ToList();
}
}
}
}
void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change || e.Info == SqlNotificationInfo.Update || e.Info == SqlNotificationInfo.Insert)
{
StatusUpdateHub.Send();
}
}