2012-07-11 2 views
2

WrapPanel에서 성능을 높이기 위해 WP7 앱에 스레딩을 도입했습니다. ListItem인데 한 개의 목록에 하나씩 다른 '목록에 추가됩니다. 아무것도하지만 - 나는 Thread.Sleep(150) 내 의견을 교체 할 때스레드, 목록 및 루핑은 좋은 생각이 아니십니까?

workerThread.DoWork += new DoWorkEventHandler((object sender, DoWorkEventArgs e) => 
{ 
    foreach (var item in OriginalItems) 
    { 
     Deployment.Current.Dispatcher.BeginInvoke(() => 
     { 
      CopyOfItems.Add(item); 
     }); 

     // I feel sooo sleepy 
    } 
}); 

지금,이 잘 작동 :

다음과
public List<Item> OriginalItems; 
public List<Item> CopyOfItems; 

BackgroundWorker.DoWork 이벤트 핸들러 내부에 넣어 년대 논리대로 : 나는 다음과 같은 두 가지 목록이 less (그리고 더 큰 값을 사용하는 경우에도 때때로) 동일한 코드에 여러 번 코드를 연속적으로 넣습니다.

왜 그런가요? 어떻게 고칠 수 있습니까?

+0

왜이 항목에 BeginInvoke를 사용합니까? UI 요소로 작업하고있는 것 같지 않습니까? – Steve

+0

UI에 데이터 바인딩 된 목록을 업데이트합니다 (위의 코드는 ViewModel에 있습니다) –

답변

5

이 알려진 C#에서 주름 - 그리고 실제로 한 당신은 람다 식에 foreach 루프에서 루프 변수를 캡처 할 때 C#을 5에 고정되고있는, 당신은 하나의 변수를 캡처하고가. 이 변수는 루프를 통해 값을 변경합니다. 따라서 "원래"반복이 완료된 후 람다 식에서 만든 대리자를 실행하면 대신 "현재"반복의 값이 표시됩니다.

foreach (var item in OriginalItems) 
{ 
    var copy = item; 
    Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     CopyOfItems.Add(copy); 
    }); 

    // I feel sooo sleepy 
} 

참조 에릭 Lippert의의 블로그 게시물 "Closing over the loop variable considered harmful"을이에 대한 자세한 내용은 :

주변의 간단한 작업을 선언하고 루프의 반복 변수의 복사본을 초기화하고 캡처하는 것입니다.

실제 코드는 실제로 코드를 수행합니까? BackgroundWorker없이 수행 할 수있는 UI 스레드 작업을 여러 청크로 분할하는 것 외에 중요한 작업을 수행하는 데 스레딩을 실제로 사용하고 있는지 여부는 명확하지 않습니다.

+0

이것은 훌륭하게 작동했습니다. 감사합니다! 귀하의 최종 질문에 대답하기 위해 - 그것은 당신이 본 것 이외의 것을 아무것도하지는 않지만 자세히 설명하지 않고, 뷰를로드하기 위해 일부 ListBoxItem의 렌더링을 지연시켜야합니다. 같은 것을하는 다른 방법이 있다고 말하면서, 정교하게 신경 쓰나요? 다시 한번 고마워, 나는 새로운 것을 배웠다! –

+0

@KrisSelbekk -이 방법이 도움이 될 경우 답변으로 표시해주세요. –

+1

@KrisSelbekk : 기본적으로 자세한 내용을 알아야합니다. 그리고 저는 앞으로 더 많은 피드백을 주려고하지 않을 것입니다 (아침 식사에 대해). 이것이 당신을 위해 일하고 있다면, 잠시 그걸로 붙어 있지만 더 자세한 내용으로 다른 질문을하십시오. (누군가는 적어도 내가 할 수있는만큼 대답 할 것입니다.) –

관련 문제