简体   繁体   English

如何使用sqldependency绑定事件并在C#中退订

[英]how to bind event with sqldependency and unsubscribe in c#

i have problem to bind event with custom parameter, its not unsubscribe while subscribe next time. 我在将事件与自定义参数绑定时遇到问题,下次订阅时不能取消订阅。 basically when 1st time subscribe event, its hold the 1st event and make new event when 2nd time subscribe. 基本上在第一次订阅事件时,它会举行第一次事件,并在第二次订阅时创建新事件。 mean there are 2 events and 3rd time there will be 3 events and so on. 表示有2个事件,第3次将有3个事件,依此类推。 but i need 1 event only each time while subscribe and unsubcribe last event. 但是我每次只需要1个事件,而订阅和取消订阅最后一个事件。

  1. dependency_Update function 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 event 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);
   }
}

can any one have solution for that, please help me, i appreciate your valuable time, thanks 任何人都可以为此解决方案,请帮助我,我感谢您的宝贵时间,谢谢

This block 这个街区

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

Doesn't do anything useful. 没有任何用处。 First, its intention is strange - you are trying to subscribe and immediately unsubscribe. 首先,它的意图很奇怪-您正在尝试订阅并立即退订。 Second, it doesn't work as expected, because, despite looking the same - your two anonymous function handlers are different. 其次,它不能按预期工作,因为尽管外观相同,但您的两个匿名函数处理程序却不同。 In effect - you never really unsubscribe your handler from OnChange event. 实际上,您永远不会真正从OnChange事件中取消订阅处理程序。 If you want to use anonymoys function, do it like that: 如果要使用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);
    }
}

Or like this: 或像这样:

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM