2009-11-06 5 views
2

지역 내에서보기를 표시하는 것은 약 5-10 초입니다. 은 처음으로으로 느려지고 내 프리즘 복합기에서 해당 기간 동안 UI가 정지합니다 WPF 응용 프로그램. 다음 번에는 UI가 멈추지 않고 View가 상대적으로 빠르게로드됩니다. 뷰는 Devexpress WPF Grid 컨트롤로 구성되며 SQL 데이터베이스에서 데이터를 가져옵니다. 그리드 컨트롤/바인딩 문제가 있다고 생각하지 않습니다. 비록 그리드 컨트롤로 바인딩을 제거해도 뷰는 거의 동일한 시간을 소요되어 영역으로 렌더링됩니다. 프리즘 합성 wpf 응용 프로그램에서 처음으로보기가 매우 느리게 로딩되는 이유

인 쉘 내부에 정의 된 지역에 내가보기를로드하는 데 사용하는 코드 :

public Action<MenuModel> LoadViewRequest { get; set; } 

public SyncController(IUnityContainer container, IEventAggregator eventAggregator, IRegionManager regionManager) 
{ 
    this.container = container; 
    this.eventAggregator = eventAggregator; 
    this.regionManager = regionManager; 
    this.LoadViewRequest = (menuItem) => { LoadRequestedView(menuItem); }; 
    this.eventAggregator.GetEvent<ViewRequestedEvent>().Subscribe(LoadViewRequest, ThreadOption.UIThread, true, i => i.Module == "Sync"); 
} 

private void LoadRequestedView(MenuModel menuItem) 
{ 
    try 
    { 
     IViewModel viewModel = this.container.Resolve<SynchronizeViewModel>(); 
     this.regionManager.Regions["ViewRegion"].Add(viewModel.View); 
     this.regionManager.Regions["ViewRegion"].Activate(viewModel.View); 
     viewModel.DisplayName = menuItem.Description; 
     this.eventAggregator.GetEvent<ViewNotificationEvent>().Publish(menuItem.Description); 
    } 
    catch (ResolutionFailedException) { } 
} 

은 무엇이 동작 뒤에 이유가 될 수 있을까? 두 번째로로드 할 때 View가 거의 순간적으로로드되는 이유는 무엇입니까? 지역에서보기를 제거한 후에도 내 응용 프로그램에서보기에 대한 참조를 보유한다는 의미입니까?

+0

응용 프로그램에서 프로파일 러를 사용해 보셨습니까? – Steoates

답변

1

대부분의 경우, View는 모든 Dev Express 및 다른 어셈블리를 메모리에로드하고 JIT로로드하고 있습니다. Infragistics WPF Controls를 사용할 때 우리 UI에서 비슷한 것을 볼 수 있습니다.

편집 : 당신은 정말 이것을 피할 수 없습니다. 어셈블리를로드해야하고 첫 번째 실행시 JITed됩니다. 시작시 어셈블리를 미리로드하고 pre-jitting the assemblies을 시도 할 수 있습니다. 그리드가 컨테이너와 다른 스레드에 의해 소유 될 것이므로 다른 UI 스레드에서 이것을 간단하게 실행할 수 없으므로 작동하지 않습니다.

데이터 그리드에서 요소 그리기에 많은 시간이 소요됩니다. Usuaully는 그리드 컨트롤이 모든 행과 셀 UI 요소를 만들고이를 데이터에 바인딩해야 할 필요가있을 것입니다. 전체적으로 WPF UI 요소가 많이 생성되어 본질적으로 상당한 시간이 걸립니다.

+0

wpf datagrid에서 datagrid를 사용할 때 비슷하게 보일 수 있습니다. 어쨌든 InitializeControls 메서드를 새 UIThread로 이동하여 나머지 응용 프로그램을 차단하지 않습니까? – Raj

0

데이터베이스 연결 설정이 오래 걸릴 수 있으며 후속 호출이 풀을 사용 중이므로 & 풀을 다시 열 필요가 없어 훨씬 빠르게 처리 할 수 ​​있습니다. 데이터베이스 액세스와 실제 작업을 구분하여 속도가 느려지는지 확인하십시오.

또한 UI가 멈추는 것을 피하기 위해 별도의 스레드에서 모든 초기화 /로드를 수행 한 다음 GUI 스레드로 다시 돌아가서 적절한 컨트롤에 적용 할 수 있습니다.

+0

데이터베이스 액세스 (아무 바인딩도없는 빈 그리드)를 잘라내더라도로드하는 데 5-10 초가 걸립니다. – Raj

+0

별도의 스레드에서 DependencyObjects를 작성할 수 없습니다. 잘못된 디스패처가 할당되고 오류가 발생합니다. –

3

성능 문제에 대한 대답은 항상 프로파일 러를 사용하는 것입니다. 우리는 하루 종일이 문제가 무엇인지에 대해 추측 할 수 있지만, 어려운 사실 없이는 추측 일뿐입니다.

성능 프로파일 러를 사용하는 방법을 배워야합니다. 제가 권장하는 것은 Redgate의 ANTS Performance Profiler (http://www.red-gate.com/products/ants_performance_profiler/index.htm)입니다. 사용하기 쉽고 웹 사이트와 프로그램 모두에서 초보자에게 많은 도움을줍니다.

이렇게하면 병목 현상이 의심되는 부분을 알 수 있습니다.

+0

프로파일 러의 결과 : InitializeComponent(); 보기에서 처음으로 약 3 초가 걸리며 후속 턴에서는 약 100ms 정도 걸립니다. – Raj

+1

글쎄, 네가 대답 해 준 것 같아. –

관련 문제