2013-05-15 4 views
1

먼저이 문제에 대해 많이 읽었지만 마음에 분명하지 않습니다.GUI 및 데이터로드 병렬

데이터베이스, 로컬/원격 파일, 웹 서비스 등에서 많은 양의 정보를로드하는 것을 의미하는 WPF 앱을 개발 중입니다. 예를 들어,이 데이터는 데이터 격자 및 이러한 유형의 컨트롤로로드됩니다.

내 응용 프로그램은 정상적으로 작동하지만 데이터로드 프로세스로 인해 사용자 환경이 좋지 않습니다. 예를 들어, 많은 양의 데이터를 요청하는 메인 윈도우에 초점을 맞추기 때문에 그리드에로드되고 표시되는 데 2-3 초가 걸립니다.

앱을 처음 실행했을 때 실제로보고 싶은 점은 GUI를 즉시로드 한 다음 데이터로드 작업을 수행하고 회 전자를 표시하거나 객체를 기다리는 중 또는 그 이상의 프로세스가 나타날 때까지 그리드 위에 표시하는 것입니다 (비동기식?)로드.

내 테스트에서 데이터를로드하는 순서 (코드에 있음)에 관계없이 생성자 내부에서 여러 이벤트가 끝날 때 (초기화,로드 등)), ShowDialog 명령 바로 앞에있는 Init 메서드에서 ... GUI 창에 재료가로드 될 때까지 나타나지 않습니다.

GUI를위한 스레드와 데이터를로드하는 비동기 스레드를 처리해야한다고 생각하지만 Dispatcher, Delegates 등을 사용하여 몇 가지 테스트를 성공적으로 수행했습니다.

요약하면 목표는 가능한 빨리 GUI를로드 한 다음 데이터를로드하고 GUI를 새로 고치는 것입니다.

이제는 다소 혼란 스러워요. 스레드, 디스패처 등에 관한 문제를 읽었지 만, 그들이 내 필요에 알맞은 지 여부는 알 수 없습니다. 따라야 할 길을 말해 줄 수 있기를 바랍니다.

감사합니다, Borja.

+2

나는 여기에 적어 놓은 것을 모두 읽는 것을 너무 게으른 습관이다. 대신 관련 코드를 게시하십시오. –

+1

BackgroundGround 작업자와 우선 순위 바인딩. 그리고 질문을 정리하십시오. – Paparazzi

+0

주요 솔루션은 큰 데이터 집합을 피하는 것입니다 (결국 GUI는 사용자 용 U와 함께). 두 번째 옵션 : 최소로 채워진 VM으로 시작하고 스레드에서 목록 (관찰 가능 항목)을 업데이트합니다. –

답변

0

기술적 인 문제이지만 일반적으로 ObservableCollection을 사용하여 데이터를 작은 항목으로 채 웁니다. 20 개의 덩어리로 항목을 추가하고 반응 형을 유지하면서 UI에 회 전자도 표시되도록합니다. 청크로드를 50ms로 유지하고 UI 스레드에서 데이터를 직접로드하지 않고 보조 스레드 (백그라운드 작업자)에서 데이터를로드하지 않습니다. 당신은 웹 서비스에 대한 동기 호출을 할 때, 당신은 실제로 처리를 수행하지 않는

,하지만 당신은 잠금있어 :

0
큰 데이터 세트의 경우

메모리에 모든 데이터를로드하는 것이 절대적으로 필요하며, 다음이 고려 결과가 리턴 될 때까지 실행. 비동기 호출을 사용하면 실제로 요청을 보냅니다. 그러면 웹 서비스가 결과를 반환 할 때까지 프로그램이 계속 실행됩니다.

비동기 호출이 작동하지 않으면 BackgroundWorker을 사용하여 모든 데이터 작업을 다른 스레드에서 수행하십시오.

두 가지 모두 주 스레드를 확보하고 양식을 렌더링 할 수있게해야합니다.

+0

BackgroundWorker가 완벽하게 작동하고 있습니다. 그 purpuse 들어, 나는 BW : DoWork (내 물건을 할), 그리고 RunWorkerCompleted (GUI를 업데이 트)의 두 가지 이벤트를 사용하여.그러나 GUI가 GUI 작업을 생성 한 동일한 스레드에서 업데이트되어야하므로이 작업이 디스패처에 의해 다음과 같이 수행되어야한다는 점을 고려해야합니다 (내 접근 방식이 올바른지는 모르겠다.) ** this. DisWorker.Invoke ((Action) (>)>> { // GUI 업데이트 }); ** –

+0

실제로 DoWork 중에 UI로 데이터를 업데이트해야합니까? 귀하가 질문하는 것처럼 회 전자를 사용하고 싶다면 왜 이것이 필요한지 확실하지 않습니다 .Dispatcher.Invoke(), 단지 RunWorkerComplete까지 계속되는 애니메이션입니다. 완료율을 전달하려면 BackgroundWorker의 ReportProgress 메서드를 사용할 수 있습니다. –