>我在将事件与自定义参数绑定时遇到问题,下次订阅时不会取消订阅。 基本上,当第一次订阅事件时,它举行第一个事件并在第二次订阅时创建新事件。 意味着有 2 个事件,第三次将有 3 个事件,依此类推。 但是我每次只需要 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();
}
}
- 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;