检查对象中存在的特定事件的事件处理程序是否存在
本文关键字:存在 事件处理 程序 是否 事件 对象 检查 | 更新日期: 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;
}