C# **信号器**SQLDependency Onchanged多次激发
我有一个ASP.Net MVC监控应用程序,带有VS2013和.Net Framework 4.5.1,每当数据库发生更改时,它都会自动刷新实时图表。当我打开浏览器的一个实例时,一切正常,但当我在同一台机器或不同的机器上打开另一个选项卡或浏览器时,它会多次触发SQLDependency事件 这是我的Repository.csC# **信号器**SQLDependency Onchanged多次激发,c#,asp.net,signalr,signalr-hub,sqldependency,C#,Asp.net,Signalr,Signalr Hub,Sqldependency,我有一个ASP.Net MVC监控应用程序,带有VS2013和.Net Framework 4.5.1,每当数据库发生更改时,它都会自动刷新实时图表。当我打开浏览器的一个实例时,一切正常,但当我在同一台机器或不同的机器上打开另一个选项卡或浏览器时,它会多次触发SQLDependency事件 这是我的Repository.cs public class Repository { private static string conString = ConfigurationManager
public class Repository
{
private static string conString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();
public List<GetTakeInCount> UpdateTRTakeInData()
{
try
{
var lst = new List<GetTakeInCount>();
using (SqlConnection con = new SqlConnection(conString))
{
using (var cmd = new SqlCommand(@"SELECT [Date],[TotalPlan],[TakeInQty],[OrderQty],[DelayedQty] FROM [dbo].[ProductTakeInData] Where [Production] = 'TR'", con))
{
cmd.Notification = null;
if (con.State == ConnectionState.Closed)
con.Open();
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
var rdr = cmd.ExecuteReader();
while (rdr.Read())
{
GetTakeInCount rowData = new GetTakeInCount();
rowData.TakeInQuantity = Convert.ToDouble(rdr["TakeInQty"].ToString());
rowData.Date = rdr["Date"].ToString();
rowData.PlanQuantity = rdr["TotalPlan"].ToString();
rowData.AccPlanQty = Convert.ToDouble(rdr["TotalPlan"].ToString());
rowData.OrderQty = Convert.ToDouble(rdr["OrderQty"].ToString());
rowData.DelayedQty = Convert.ToDouble(rdr["DelayedQty"].ToString());
lst.Add(rowData);
}
rdr.Dispose();
}
}
return lst;
}
catch (Exception e)
{
throw e;
}
}
private void dependency_OnChange(object sender, SqlNotificationEventArgs e) //this will be called when any changes occur in db table.
{
if (e.Type == SqlNotificationType.Change)
{
//Call SignalR
MyHub mh = new MyHub();
mh.UpdateChart();
}
SqlDependency dependency = sender as SqlDependency;
if (dependency != null) dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);
}
}
有人可以帮忙吗?Ryan,您可以重新查看事件取消注册和注册部分 SqlDependency=newsqldependencycmd; dependency.OnChange-=新的OnChangeEventHandlerdependency\u OnChange; dependency.OnChange+=新的OnChangeEventHandlerdependency\u OnChange 我认为最好使用SqlDependency的singleton对象,然后对其进行注销和注册
为此,您可以创建一个singleton类,该类将为您提供一个SqlDependencycmd实例,而不是执行新的SqlDependencycmd,您可以调用singletonclass的getInstancecmd方法并对其进行注销和注册。您好,先生,我不知道如何为sql依赖项执行singleton对象。你能给我一些建议或链接,指导我这样做吗?非常感谢。
[HubName("MyHub")]
public class MyHub : Hub
{
public void UpdateChart()
{
List<GetTakeInCount> data = new List<GetTakeInCount>();
Repository rep = new Repository();
data = rep.UpdateTRTakeInData();
IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.updateChartData(data);
}
}
$(function () {
// Declare a proxy to reference the hub.
var chartConnection = $.connection.MyHub;
$.connection.hub.logging = true;
//debugger;
// Create a function that the hub can call to broadcast messages.
chartConnection.client.updateChartData = function () {
updateChart();
console.log('hub started')
};
// Start the connection.
$.connection.hub.start();
updateChart();
});
function updateChart()
{
-- Update Chart Code ---
}