2010-08-18 2 views
3

효율적인 애플 리케이션을 만드는 것이 좋으며 종종 애플리케이션의 응답 성을 향상시키기 위해 동시성과 멀티 스레딩을 고려하지만 요즘에는 WPF의 단일 스레드 방식으로 내 시도가 항상 차단 된 것처럼 보입니다. 아무리 효율적이고 평행 한 코드라도 WPF는 지속적으로 내 UI를 멈추게하고 내 앱을 놀라 울 정도로 반응이없는 것처럼 보입니다. 때때로 렌더링하는 창을 기다리는 동안 마우스 커서가 움직이지 않는 초를 걸릴 수 있습니다. 속도를 내려면 내가 할 수있는 일이 없어 보이는 것처럼 좌절감을 느낍니다.WPF 랜더링 병목 현상 해결

내 질문에, 입니다. 내 WPF 앱에서 응답 성을 향상시킬 수있는 방법이 있습니까? 내 창은 스타일과 구성면에서 다소 복잡한 경향이 있으며 이미 가상화 StackPanels를 사용하고 있습니다.

문제점을 설명하려면 다음과 같이하십시오. 검색 상자 역할을하는 텍스트 상자가 있으며 각 결과가 UserControl에 캡슐화되고 ItemsControl에 표시된대로 사용자가 입력 할 때 즉시 결과를 표시하려고합니다. 배경 스레드를 사용하여 검색을 수행하고 있습니다. 문제는 WPF가 UI를 완전히 멈추게하는 검색 결과를 렌더링하여 WPF가 버려지는 동안 한 번에 두 번째로 입력이 고정되므로 전체 "결과를 입력 할 때"를 매우 실용적이지 않게 만드는 것입니다.

WPF가 렌더링되는 동안 UI 스레드가 멈추는 것을 피할 수있는 방법이 있습니까?

+3

이것은 제대로 들리지 않습니다. 앱이 모든 작업을 수행하고 모든 검색 결과를 생성 할 수 있지만 결국에는 빈 목록을 표시합니까? 그렇게하면 실제로 렌더링과 관련이 있는지 알 수 있습니다. 또한 크로스 스레드 통신에는 많은 오버 헤드가 있습니다. 단 한 번의 호출로 UI 스레드로 전체 목록을 다시 전달합니까? (배경 스레드의 컬렉션에 항목을 추가하면 개별 알림을 보내면 성능이 저하됩니다.) – Nir

+0

흠, 뭔가있을 수 있습니다. 결과 목록을 수정하지 못하게 할 때, 아직 일어나지 않아야 할 몇 가지 분명한 지연이 있습니다. 나는 이것을 조사 할 것입니다 - 아이디어에 감사드립니다. – devios1

+0

감사합니다 Nir - 당신의 아이디어는 이전에 눈치 채지 못했던 UI 스레드에서 발생했던 주요 둔화를 확인하는 결과를 가져 왔습니다. 이를 검색 스레드로 이동하면 응답 성이 크게 향상되었습니다. 그래서 언뜻보기에는 상황이 거의 나쁘지 않습니다. :) – devios1

답변

1

이미 데이터를 가져 오기 위해 스레드를 사용하고 있다는 것을 감안할 때 반환되는 데이터 세트가 느려질만큼 커질 수 있다고 추측 할 수 있습니다. 예를 들어 이름 배열을 가져 오는 스레드가있을 수 있지만 결과가 수천, 수천 개가 넘는 경우 바인드 할 때 성능이 크게 떨어질 수 있습니다.

내가 생각할 수있는 유일한 전략은 SQL Server를 수행하는 경우 TOP SQL 절을 사용하여 스레드에서 오는 결과를 좁히는 것입니다. 또는 실제로 올 모든 데이터를 표시해야하는 경우 다시 말해 스트림을 청크로 분할하면 UI가 한 번에 많은 데이터를 렌더링 할 필요가 없습니다. 후자의 옵션은 다소 복잡 할 수 있으며, 처음부터 새로 만들거나 적어도 UI 컨트롤을 재정의해야 할 수도 있습니다.

+0

결과의 수는 수백 개, 예를 들면 300 개입니다. 가상화 스태커 패널을 사용하고 있기 때문에 한 번에 12 개 또는 2 개 정도만 렌더링 할 수 있습니다. 그렇지만 사용자 입력과 관련하여 여전히 느린 속도입니다. – devios1

+0

아참, 그건 끔찍해. 프레임 워크의 어떤 버전. 4.0을 사용하지 않는다면 엄청난 성능 개선으로 선전 될 것입니다. 또한 렌더링이 아닌 경우 속도 저하를 유발하는 바인딩이 있어야합니다. –

+0

4 4.0을 사용 중입니다. 초기에 약간의 개선이 있었지만이 문제를 극복하기에는 충분하지 않았습니다. 지금 나는 문제의 원인이 무엇인지 모르겠다. 비록 바인딩을 많이 사용하고 있지만. – devios1

관련 문제