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

C# 如何在c中绑定事件与sqldependency并取消订阅#,c#,events,eventhandler,sqldependency,C#,Events,Eventhandler,Sqldependency,我无法用自定义参数绑定事件,它不能在下次订阅时取消订阅。基本上在第一次订阅活动时,它会在第二次订阅时举行第一次活动并制作新的活动。平均有2个事件,第3次将有3个事件,依此类推。但我每次只需要一个事件,而订阅和取消订阅最后一个事件 依赖更新函数 依赖项更改事件 任何人都可以解决这个问题,请帮助我,我感谢你宝贵的时间,谢谢你的帮助 dependency.OnChange += new OnChangeEventHandler((s, e) => dependency_OnChange(s, e

我无法用自定义参数绑定事件,它不能在下次订阅时取消订阅。基本上在第一次订阅活动时,它会在第二次订阅时举行第一次活动并制作新的活动。平均有2个事件,第3次将有3个事件,依此类推。但我每次只需要一个事件,而订阅和取消订阅最后一个事件

  • 依赖更新函数
  • 依赖项更改事件
  • 任何人都可以解决这个问题,请帮助我,我感谢你宝贵的时间,谢谢你的帮助

    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
    事件中取消订阅处理程序。如果要使用Anonymousys函数,请按以下方式操作:

    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;
    
    这个街区

    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
    事件中取消订阅处理程序。如果要使用Anonymousys函数,请按以下方式操作:

    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;
    

    你能澄清你的问题吗?“下次订阅时不退订”不是很清楚。你们期待什么,出了什么问题?@Evk谢谢你们的回答,我只是更新了问题,你们能澄清你们的问题吗?“下次订阅时不退订”不是很清楚。你期望什么,出了什么问题?@Evk谢谢你的回答,我只是更新了问题,再次我用这两种方法都遇到了同样的问题。你能看看有什么问题吗,因为我又遇到了同样的问题。thanks@adnan你到底是如何看待同样的问题的?如何测试?因为在注销应用程序时,我只是停止sqldependency并在登录应用程序时重新启动,但同样的问题正如我已经指出的,它不会取消订阅事件,并且在注销应用程序后它会保留所有事件,以及我们登录或注销其调用次数依赖事件。谢谢,我用这两种方法都有同样的问题。你能看看有什么问题吗,因为我又有同样的问题了。thanks@adnan你到底是如何看待同样的问题的?如何测试?因为在注销应用程序时,我只是停止sqldependency并在登录应用程序时重新启动,但同样的问题正如我已经指出的,它不会取消订阅事件,并且在注销应用程序后它会保留所有事件,以及我们登录或注销其调用次数依赖事件。谢谢