2010-08-05 3 views
0

이 시나리오에 가장 적합한 방법이 무엇인지 궁금해했습니다. 다른 백그라운드 스레드에서 채워지는 컬렉션에 데이터 바인딩하려고합니다.데이터에 대한 데이터 바인딩이 wpf의 다른 스레드에서 여전히 처리 중임

내 백그라운드 스레드가 몇 분 동안 실행될 수있는 처리 루프의 항목을 컬렉션에 추가하고 있습니다. 때때로 UI에 이벤트를 발생시키고 UI에서 시각화하기 위해 컬렉션의 데이터에 대한 참조를 전달하므로 사용자는 자신이 가지고있는 것과 상호 작용할 수 있고 처리를 계속할 수 있습니다.

UI가 데이터 콜렉션에 대해 foreach() 루프와 관련된 시각화 (꽤 복잡한 자체)를 렌더링하는 데 문제가 있습니다. 배경 스레드가 컬렉션의 데이터를 변경하면 루프가 스스로를 망칠 수 있습니다. 열거 중.

그래서 내 브레인 스토밍은 다음과 같이 간 :

  1. 일시 정지 백그라운드 스레드를; 그러나 나는 정말로 멈추고 싶지 않다.
  2. 는 모든 스냅 샷 복사본 또는 각 이벤트의 일부 데이터와 스냅 샷에 대한 데이터 바인딩을 취한다. 내 메모리 사용량을 두 배로 늘리지 만 UI가 백그라운드 프로세스를 업데이트하는 동안 기다려야하므로
  3. 이 syncroot 또는 컬렉션의 어떤 종류의 잠금을 구현합니다. 모든 시간과 단지 .. # 2와 같은 결과를 가지고 시간에하지만 더 오버 헤드

환호 ewart을 한 비트의 데이터를 전달하는 이벤트 어쨌든 작업

  • 화재에 대한 확신하지 않습니다.

  • 답변

    0

    문제를 해결하는 가장 쉬운 방법은 루프를 시작하기 전에 foreach 루프를 0에서 컬렉션의 항목 수까지 루프하는 for 루프로 변경하는 것입니다.

    대신 :

    var coll = new List<string>(); 
        foreach (string item in coll) 
        { 
         //do your stuff 
        } 
    

    사용 :

    var coll = new List<string>(); 
        int length = coll.Count - 1; 
        for (int i = 0; i < length; i++) 
        { 
    
        } 
    

    또는

    나는 당신의 UI가 얼마나 복잡한 모르지만 WPF와 함께 당신은 거의 항상 진보에 코드를 변경할 수 있습니다 ObservableCollection에 바인딩 된 데이터 바인딩. Observable 컬렉션은 항목이 추가되거나 제거 될 때 바인딩 업데이트를 트리거합니다. 그러나이를위한 솔루션을 제공하려면 UI 구축 방법에 대한 많은 정보가 필요합니다.

    관련 문제