2010-01-18 2 views
3

내 모델에서는 ObservableCollection의 CollectionChanged 이벤트에 가입하기 위해 특정 컬렉션이 변경 될 때이를 인식해야합니다. 이것은 작업이 상당히 비싼 자원이라는 점을 제외하면 정말 잘 작동합니다.ObservableCollection.CollectionChanged에서 값 비싼 작업 실행

클라이언트 코드가 않습니다 그래서 때

foreach(Item i in longList) 
{ 
    model.ObservableCollection.Add(i); 
} 

마지막 항목이 추가 된 후 중요하다 모든 결과 때 각 반복에 대한 비용이 많이 드는 작업을 실행하고 있습니다.

다른 CollectionChanged 이벤트가 발생해도 첫 번째 이벤트가 여전히 실행 중일 때 현재 실행중인 이벤트 핸들러를 취소 한 다음 가장 최근 이벤트를 계속 처리 할 수 ​​있습니까?

답변

-2

직접적으로. 실행중인 프로세스가 동 기적으로 실행되므로 현재 프로세스가 완료 될 때까지 다음 이벤트가 발생하지 않습니다.

이와 같은 상황의 한 가지 대안은 CollectionChanged에서 타이머를 시작한 다음 타이머 틱에서 처리하는 것입니다. 이렇게하면 CollectionChanged를 여러 번 실행하면 타이머가 이미 활성화되고 단일 "틱"이벤트 만 가져옵니다.

+0

이것에 대해 자세히 설명해 주시겠습니까? 이것은 가장 최근에 제기 된 것 대신에 첫 번째 사건 만 처리할까요? – djskinner

+0

일반적으로 타이머를 실행하면 대기열에 넣지만 처리합니다. 이렇게하면 메서드 호출을 피하면서 하나의 메서드 호출에서 모든 이벤트를 처리하게됩니다. 이것은 "너무 많은"이벤트가 발생하는 많은 상황에서 유용합니다 ... –

3

ObservableCollection은 봉인 된 클래스가 아닙니다. 자신을 파생시키고 BeginUpdate 및 EndUpdate() 메서드 및 IsUpdating 속성을 추가합니다.

관련 문제