2010-08-06 3 views
0

모음 (List<T>)에 바인딩 된 WPF ListView가 있습니다. 현재 잘 작동하는 현재 스레드에서 업데이트됩니다.스레드 안전성, 목록, 바인딩 및 WPF

목록을 스레드로 업데이트하기위한 논리를 옮기고 스레드 안전성과 목록 바인딩에 관한 몇 가지 잠재적 인 문제를 봅니다. NotifyPropertyChanged으로 전화하지 않으면 바인딩이 업데이트되지 않을 것이라고 확신 할 수 있습니까? NotifyPropertyChanged은 블로킹 호출입니까 아니면 단순히 메시지 대기열에 추가하는 것입니까? 이 인스턴스에서 확실하게 내가 컬렉션을 업데이 트 ListView하지만, 시간이 바인딩을 업데이 트하는 예외가 던지거나 프로그램을 충돌하는 다른 스레드에서 컬렉션을 수정할 수 있습니다 조건이있을 수 있습니다.

이러한 시나리오에서 스레드 안전을 구현하는 가장 좋은 방법은 무엇입니까?

void ThreadProc() 
{ 
    window.Dispatcher.Invoke(() => { 
     //UpdateList 
    }); 
} 

답변

1

에서 INotifyPropertyChanged는 스레드로부터 안전하지 않습니다, 그리고 호출 스레드를 차단하지 :

1

당신은 Dispatcher.Invoke에서 컬렉션을 업데이트하는 스레딩 문제를 방지 할 수 있습니다.

최고? 그건 좋은 질문이야. 나는 몰라. 결론은 UI 스레드에 호출을 마샬링해야한다는 것입니다. 언제 이것을합니까?

모든 것을 준비한 다음 UI 스레드로 전달하여 UI가 업데이트됩니다. 또는 2) INotifyPropertyChanged를 구현하고 UI 스레드에서 이벤트 발생을 항상 발생 시키거나 3) 여러 가지 작업 중 하나를 수행 할 수 있습니다.

그러나 대개 사용자가 단일 항목을 ObservableCollection에 추가 할 때처럼 한 번에 하나씩 UI를 업데이트해야합니다. 따라서 INotifyProperty 및 CollectionChanged를 구현하고이를 사용하는 스레드로부터 안전한 기본 클래스를 만드는 것이 좋습니다.

안타깝게도이 작업을 수행 할 프레임 워크는 없습니다.

+0

Invoke는 차단 호출이 아니지만? 그런 다음 목록을 수정하는 동시에 바인딩을 업데이트 할 수 있습니다. – Chris

+0

@Chris 동기식이지만 Begin/EndInvoke를 항상 호출 할 수 있습니다. – Will