** SignalR ** SQLDependency Onchanged запущен несколько раз - PullRequest
0 голосов
/ 10 мая 2019

У меня ASP.Net MVC Мониторинговое приложение с VS2013 и .Net Framework 4.5.1, которое должно автоматически обновлять диаграмму в реальном времени каждый раз, когда происходят изменения в базе данных. Все работает нормально, когда у меня открыт один экземпляр браузера, но когда я открываю другую вкладку или браузер на том же компьютере или на другом компьютере, он запускает событие SQLDependency несколько раз.

Вот мой репозиторий.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);
    }

}

Вот мой хаб

[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);
        }  

    }

Вот мой JS материал:

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

Кто-нибудь может помочь?

1 Ответ

0 голосов
/ 10 мая 2019

Райан, Вы можете повторно просмотреть событие отмены регистрации и регистрации.

"SqlDependency dependency = new SqlDependency(cmd); dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange); dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);"

Я думаю, что лучше иметь одноэлементный объект SqlDependency, а затем выполнить отмену регистрации& регистрация этого.

Чтобы сделать это, вы можете создать одноэлементный класс, который даст вам экземпляр SqlDependency, и вместо выполнения «new SqlDependency (cmd)» вы можете вызвать метод getInstance (cmd) этого методаСинглтонкласс и отмените регистрацию и зарегистрируйтесь.

...