为重复的问题道歉。我用google搜索,到处都找到了问题,但没有找到成功解决方案。我面临着与here和here完全相同的问题并且在过去的一周里苦苦挣扎,但我没有找到任何成功,所以最后我决定在这里提出一个问题。我试图通过遵循这些问题中提出的意见来解决这个问题,但要成功。我希望SqlDependency onchange事件只针对实例或登录的用户激发一次。
只要新用户登录应用程序
,就会调用此方法一次 public List<TransactionMaster> GetUnregisteredTransactions()
{
List<TransactionMaster> ltrans = new List<TransactionMaster>();
TransactionMaster trans = new TransactionMaster();
using (var connection = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString))
{
string query = "SELECT TransId, ReceivedFrom,ReceivedOn,Mask FROM [dbo].TransactionMaster WHERE StageId =1";
SqlDependency.Start(ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString);
using (SqlCommand cmd = new SqlCommand(query, connection))
{
cmd.Notification = null;
DataTable dt = new DataTable();
SqlDependency dependency = new SqlDependency(cmd);
dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
if (connection.State == ConnectionState.Closed)
connection.Open();
SqlDataAdapter adapter = new SqlDataAdapter(cmd);
adapter.Fill(dt);
ltrans = dal.ConvertDataTable<TransactionMaster>(dt);
}
}
return ltrans;
}
然后再从onchange事件
调用此方法 private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
if (e.Type == SqlNotificationType.Change)
TransactionHub.GetUnregTransactions(GetUnregisteredTransactions());
}
答案 0 :(得分:1)
每次拨打GetUnregisteredTransactions
时,您正在呼叫dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
,这会导致新事件被注册,因此现在您有两个事件将被触发。当两个事件触发时,它会再次调用dependency.OnChange += new OnChangeEventHandler(dependency_OnChange);
两次,使其触发4个事件。
dependency
指向的是垃圾。
您需要重新注册对来自事件版本的调用的依赖性(例如,将bool
传递给函数以了解它是否应该进行注册),或者您需要取消注册旧的在创建新通知之前发出通知。
以下是取消注册的示例。
private void dependency_OnChange(object sender, SqlNotificationEventArgs e)
{
SqlDependency dependency = (SqlDependency)sender;
dependency.OnChange -= new OnChangeEventHandler(dependency_OnChange);
if (e.Type == SqlNotificationType.Change)
TransactionHub.GetUnregTransactions(GetUnregisteredTransactions());
}
答案 1 :(得分:0)
对于我来说,每次事件触发时,我都会将事件添加到依赖项中
dependency.OnChange += new OnChangeEventHandler(SqlNotification.dependency_OnChange);
找到this solution后,我将代码更改为:
dependency.OnChange -= new OnChangeEventHandler(SqlNotification.dependency_OnChange);
dependency.OnChange += new OnChangeEventHandler(SqlNotification.dependency_OnChange);
这解决了我的问题。