您可以在附加之前删除处理程序
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;
}