SqlDependency onchange为每个浏览器实例多次触发

时间:2017-09-23 16:54:57

标签: c# sqldependency

为重复的问题道歉。我用google搜索,到处都找到了问题,但没有找到成功解决方案。我面临着与herehere完全相同的问题并且在过去的一周里苦苦挣扎,但我没有找到任何成功,所以最后我决定在这里提出一个问题。我试图通过遵循这些问题中提出的意见来解决这个问题,但要成功。我希望SqlDependency onchange事件只针对实例或登录的用户激发一次。

只要新用户登录应用程序

,就会调用此方法一次
 public List<TransactionMaster> GetUnregisteredTransactions()
    {
        List<TransactionMaster> ltrans = new List<TransactionMaster>();
        TransactionMaster trans = new TransactionMaster();

        using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
        {
            string query = "SELECT TransId,  ReceivedFrom,ReceivedOn,Mask FROM [dbo].TransactionMaster  WHERE StageId =1";
            SqlDependency.Start(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
            using (SqlCommand cmd = new SqlCommand(query, connection))
            {
                cmd.Notification = null;
                DataTable dt = new DataTable();

                SqlDependency dependency = new SqlDependency(cmd);
                dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
                if (connection.State == ConnectionState.Closed)
                    connection.Open();
                SqlDataAdapter adapter = new SqlDataAdapter(cmd);
                adapter.Fill(dt);
                ltrans = dal.ConvertDataTable<TransactionMaster>(dt);
            }
        }
        return ltrans;
    }

然后再从onchange事件

调用此方法
 private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
    {
        if (e.Type == SqlNotificationType.Change)
            TransactionHub.GetUnregTransactions(GetUnregisteredTransactions());

    }

2 个答案:

答案 0 :(得分:1)

每次拨打GetUnregisteredTransactions时,您正在呼叫dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);,这会导致新事件被注册,因此现在您有两个事件将被触发。当两个事件触发时,它会再次调用dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);两次,使其触发4个事件。

,这个数字会在每次调用时加倍,直到对象dependency指向的是垃圾。

您需要重新注册对来自事件版本的调用的依赖性(例如,将bool传递给函数以了解它是否应该进行注册),或者您需要取消注册旧的在创建新通知之前发出通知。

以下是取消注册的示例。

private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
    SqlDependency dependency = (SqlDependency)sender;
    dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);

    if (e.Type == SqlNotificationType.Change)
        TransactionHub.GetUnregTransactions(GetUnregisteredTransactions());

}

答案 1 :(得分:0)

对于我来说,每次事件触发时,我都会将事件添加到依赖项中

 dependency.OnChange += new OnChangeEventHandler(SqlNotification.dependency_OnChange);

找到this solution后,我将代码更改为:

 dependency.OnChange -= new OnChangeEventHandler(SqlNotification.dependency_OnChange);
 dependency.OnChange += new OnChangeEventHandler(SqlNotification.dependency_OnChange);

这解决了我的问题。