如何用sqldependency绑定事件并在c#中取消订阅

时间:2017-11-14 06:20:05

标签: c# events eventhandler sqldependency

我有问题将事件与自定义参数绑定,下次订阅时不会取消订阅。基本上在第一次订阅活动时,它举行第一次活动并在第二次订阅时创建新活动。意味着有2个事件,第3次将有3个事件,依此类推。但是每次订阅和取消订阅最后一次活动时我只需要1个活动。

  
      
  1. dependency_Update function
  2.   
public void dependency_Update(Guid clientid)
{
    SqlDependency.Stop(connString);
    using (SqlCommand command = new SqlCommand(SQL.newemailmessagescountbyclient_sql(), connection))
    {
       connection.Open();
       command.Parameters.Add(new SqlParameter("@clientid", clientid));
       command.Notification = null;
       SqlDependency.Start(connString);
       SqlDependency dependency = new SqlDependency(command);
       dependency.OnChange += new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid));
       dependency.OnChange -= new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid));
       var reader = command.ExecuteReader();
       connection.Close();

     }
 }
  
      
  1. dependency_OnChange事件
  2.   
public void dependency_OnChange(object sender, SqlNotificationEventArgs e, SqlDependency dependency, Guid clientid)
{
   if (e.Type == SqlNotificationType.Change)
   {
     //subscribe function again
     dependency_Update(clientid);
   }
}

任何人都可以解决这个问题,请帮助我,感谢您宝贵的时间,谢谢

1 个答案:

答案 0 :(得分:0)

此块

dependency.OnChange += new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid));
dependency.OnChange -= new OnChangeEventHandler((s, e) => dependency_OnChange(s, e, dependency, clientid));

没有做任何有用的事情。首先,它的意图很奇怪 - 您正在尝试订阅并立即取消订阅。其次,它没有按预期工作,因为尽管看起来一样 - 你的两个匿名函数处理程序是不同的。实际上 - 您永远不会从OnChange事件中取消订阅您的处理程序。如果你想使用anonymoys函数,那就这样做:

SqlDependency dependency = new SqlDependency(command);
OnChangeEventHandler handler = null;
handler = (s, e) => dependency_OnChange(s, e, clientid, handler);
dependency.OnChange += handler;

public void dependency_OnChange(object sender, SqlNotificationEventArgs e, Guid clientid, OnChangeEventHandler handler) {
    var dependency = (SqlDependency)sender;
    if (e.Type == SqlNotificationType.Change) {
        dependency.OnChange -= handler;
        //subscribe function again
        dependency_Update(clientid);
    }
}

或者像这样:

OnChangeEventHandler handler = null;
handler = (s, e) => {
      dependency.OnChange -= handler;
      dependency_OnChange(s, e, clientid);                    
};
dependency.OnChange += handler;