如何在 C# 中将事件与 SQL依赖项绑定并取消订阅



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

  1. dependency_Update功能
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事件
public void dependency_OnChange(object sender, SqlNotificationEventArgs e, SqlDependency dependency, Guid clientid)
{
   if (e.Type == SqlNotificationType.Change)
   {
     //subscribe function again
     dependency_Update(clientid);
   }
}

任何人都可以对此有解决方案,请帮助我,感谢您的宝贵时间,谢谢

此块

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事件的处理程序。如果你想使用匿名功能,可以这样做:

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;

最新更新