检查对象中存在的特定事件的事件处理程序是否存在

本文关键字:存在 事件处理 程序 是否 事件 对象 检查 | 更新日期: 2023-09-27 18:26:57

我在for循环中使用了以下代码片段

DataTable childTable = dataTable.DataSet.Relations[relationName].ChildTable;
if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
}

在这种情况下,我需要检查是否已经为iBindinglist对象调用了listchanged事件。请你对此进行调查并提出实现这一目标的建议。谢谢你。

谨致问候,Rajasekar

检查对象中存在的特定事件的事件处理程序是否存在

无法查看是否已经添加了处理程序。幸运的是,你不需要。

iBindingList.ListChanged -= GridDataRecord_ListChanged;
iBindingList.ListChanged += GridDataRecord_ListChanged;

假设一个行为良好的类(在这种情况下,您应该能够相信该类行为良好),即使没有添加GridDataRecord_ListChanged,也可以安全地删除它。移除它将毫无作用。如果您只在删除处理程序后才添加它,那么它永远不会被多次添加。

您可以在附加之前删除处理程序

if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged -= new ListChangedEventHandler(GridDataRecord_ListChanged);
   iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
}

如果您正在运行一个单线程环境,并且一直像这样附加此事件,那么它应该没问题。但是,如果存在多个线程,则可能存在竞争条件。正如评论中提到的,如果有多个线程连接同一个委托,这就是一个问题。-=只删除最后一个委托,因此多次添加和一次删除将意味着该事件仍然是附加的。

或者,有一个标志来检查事件是否已订阅。

bool listChangedSubscribed = false;  
if (childTable != null)
{
   iBindingList = childTable.AsDataView() as IBindingList;
   iBindingList.ListChanged -= new ListChangedEventHandler(GridDataRecord_ListChanged);
   if(!listChangedSubscribed)
   {
       iBindingList.ListChanged += new ListChangedEventHandler(GridDataRecord_ListChanged);
       listChangedSubscribed = true; 
   }