객체

2013-08-07 1 views
2

에서 특정 이벤트에 존재하는 존재 나는 나가의 ListChanged 이벤트가 이미 iBindinglist 객체에 대해 호출되어 있는지 확인하기 위해 필요한이 경우 루프객체

DataTable childTable = dataTable.DataSet.Relations[relationName].ChildTable; 

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

의에서 다음과 같은 코드를 사용합니다. 이 문제를 조사하고이를 달성하기위한 제안을 해 주실 수 있습니까? Advcance에 감사드립니다.

감사합니다, Rajasekar 처리기가 이미 추가되어 있는지 확인하는 방법은 없습니다

답변

4

. 다행히도, 당신은 필요가 없습니다.

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

잘 행동 클래스를 가정하면 (이 경우, 당신은 클래스가 잘 동작하는 것을 신뢰할 수 있어야한다), 당신은 안전하게이 추가되지 않은 경우에도 GridDataRecord_ListChanged를 제거 할 수 있습니다. 제거하면 아무 일도하지 않게됩니다. 처리기를 제거한 후에 만 ​​추가하면 여러 번 추가되지 않습니다.

1

당신은

단일 스레드 환경을 실행하고 있으며이 같은 모든 시간을이 이벤트를 첨부 할 경우
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; 
    } 
+1

여러 스레드에 대한 좋은 지적으로, 나는 그것에 대해 잊어 버렸습니다. 동일한 'iBindingList'를 사용하는 스레드가 여러 개있는 경우에는 똑같은 위임자를 추가하려고하는 스레드가 여러 개인 경우에만 중요합니다. 설명을 위해 – hvd

+0

+1. '- ='는 마지막 대리자 만 제거하므로 여러 번 추가하고 한번 제거하면 이벤트가 계속 첨부됩니다. – keyboardP