SignalR多次触发客户端集线器事件

时间:2015-09-17 23:54:09

标签: c# asp.net-mvc signalr signalr-hub sqldependency

我正在使用带有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();
        }
    } 

0 个答案:

没有答案