2011-08-23 5 views
3

두 개의 서로 다른 관찰 가능한 컬렉션의 정보를 표시하는 두 개의 목록 뷰가있는 WPF 프로그램이 있습니다. 관찰 가능한 컬렉션은 1 초마다 발생하는 타이머에서 업데이트됩니다.WPF - 매우 산발적으로 업데이트되는 목록보기

어떤 이유로 데이터 수집이 업데이트 될 때 이러한 목록보기가 업데이트되지 않습니다 ... 가끔씩 업데이트되지만 일어날 것이라는 보장은 없습니다. 전체 프로그램을 10 분 동안 실행할 수 있으며 아무 것도 표시되지 않습니다 ... 출력 창에 데이터 바인딩 오류도 없습니다. 사실 시작할 때 모음을 채우면 바인딩을 테스트하기 위해 모든 항목이 문제없이 표시됩니다. 문제가있는 프로그램 실행 중에 항목을 동적으로 추가 할 때만입니다.

어떤 이유로 나는 정의하거나 요청 결코 실행 작업자 스레드의 전체 부하 가지고 있기 때문에 디버깅하려고하면 프로그램을 따라하는 것은 불가능 경우 :

http://i.imgur.com/wq5ND.png

나는이 생각을 여분의 스레드가 문제의 일부일 수 있습니다. C#에서 자바에서 synchronized 키워드처럼 threadsafe로 함수를 정의하는 쉬운 방법이 있습니까?

편집 :

JFifoErrorCollection.Add(errorData); 
JFifoList.Items.Refresh(); 
break; 

편집 # 2 : 나는 UI 스레드에서 실행되지 않은이 System.Threading.Timer를 사용했다 ..이 문제를 해결했다. System.Windows.Forms.Timer로 변경되었으며 이제는 완벽하게 작동합니다.

+1

ListBox는'List' 또는'ObservableCollection'에 바인딩되어 있습니까? 그리고 ListBox를 업데이트하는 코드를 게시 할 수 있습니까? – Rachel

+0

@Rachel JFifoErrorCollection.Add (errorData); JFifoList.Items.Refresh(); 휴식; 그것이 ObservableCollection 유형의 컬렉션에 추가하는 방법입니다. 작업 스레드가 컬렉션에 추가되는 작업자 스레드 일 수 있습니다. 즉, 컬렉션 변경 이벤트가 Main/UI 스레드에서 발생하지 않았습니까? 주 스레드는 결코 그 기능을 입력하지 않는 것 같습니다. – Luke

+1

@ 루크, 컬렉션 변경 이벤트가 UI 스레드에서 발생하지 않았는지 확인하기 쉽도록 테스트하는 것은 컬렉션에 추가하지만 Dispatcher의 스레드에서 자체를 호출하는 메서드를 만드는 것입니다. 업데이트가 표시되면 문제가 무엇인지 알 수 있습니다. 예제가 필요하면 알려주세요. – Josh

답변

1

DispatcherTimer에 내장 된 WPF를 사용하십시오.

+0

System.Windows.Forms.Timer로 오래전에이 문제가 해결되었지만 앞으로 DispatcherTimer를 사용할 것입니다. 감사. – Luke