다른 그리드에 대한 벤치마킹을 벤치마킹하려는 시나리오를 발견 할 때까지 스레딩에 대해 잘 알고 있다고 생각했습니다.백그라운드에서 목록을 업데이트 할 때 UI 스레드가 멈추는 이유는 무엇입니까?
그리드 컨트롤이있는 창을 만들고 ObservableCollection
에 바인딩하고 5000 개의 행에 몇 가지 복잡한 데이터 유형 (잠금이 없음)을 채 웁니다.
은 그 때 나는 그 각각은 물론의 INotifyPropertyChanged
이벤트를 발생, 내 ObservableCollection
에서 임의의 항목에 임의의 속성을 업데이트
Task.Factory.StartNew()
이 아주 꽉 루프를 통해 갔다 (1000 만 반복)를 사용하여 작업을 생성 .
배경 스레드에서 업데이트가 모두 발생했기 때문에 UI가 업데이트 될 것으로 예상했지만, 백그라운드 스레드가 빡빡한 루프에서 돌아가는 것을 견디기는 힘들지만 말입니다.
대신에 UI는 몇 초 동안 얼었지만 (공백이 생기지 않았거나 운명의 일반적인 회전 커서가 생성되지 않음) 배경 스레드가 완료되면 돌아 왔습니다.
내 이해는 UI 스레드에 WPF 런타임에 의해 자동으로 마샬링되는 수많은 INPC를 생성하면서 백그라운드 스레드가 코어에 과도하게 부담을 줄 것이라고 생각했습니다.
이제 UI 스레드가 아무 것도하지 않아서 모든 INPC를 소비하고 그리드를 업데이트 할 것으로 예상했지만 그렇지 않았습니다. 단일 업데이트가 발생하지 않았습니다. 그러나, 타이머 (단단한 루프 대신)를 사용하여이 작업을 수행하면 정상적으로 작동합니다.
누군가가 UI 스레드가 무슨 일을하고 있는지 알려주시겠습니까? 미리 감사드립니다!
이 문제를 보여주는 가장 짧은 코드 예를 제공 할 수 있습니까? –
"tight loop"란 각 반복마다 지연이 없음을 의미합니까? UI가 유지할 수없는 업데이트로 포격당하는 간단한 경우 인 것 같습니다. – McGarnagle