我有问题将事件与自定义参数绑定,下次订阅时不会取消订阅。基本上在第一次订阅活动时,它举行第一次活动并在第二次订阅时创建新活动。意味着有2个事件,第3次将有3个事件,依此类推。但是每次订阅和取消订阅最后一次活动时我只需要1个活动。
- dependency_Update function
醇>
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();
}
}
- 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);
}
}
任何人都可以解决这个问题,请帮助我,感谢您宝贵的时间,谢谢
答案 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;