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