Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# **信号器**SQLDependency Onchanged多次激发_C#_Asp.net_Signalr_Signalr Hub_Sqldependency - Fatal编程技术网

C# **信号器**SQLDependency Onchanged多次激发

C# **信号器**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

我有一个ASP.Net MVC监控应用程序,带有VS2013和.Net Framework 4.5.1,每当数据库发生更改时,它都会自动刷新实时图表。当我打开浏览器的一个实例时,一切正常,但当我在同一台机器或不同的机器上打开另一个选项卡或浏览器时,它会多次触发SQLDependency事件

这是我的Repository.cs

  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 ---
    }