2012-06-21 2 views
2

나는 데이터베이스 쿼리, 데이터 그리드 커스터마이징 및 많은 데이터로드로 인해 첫 번째 창을로드하는 데 3-5 초가 걸리는 이전 winforms 애플리케이션을 유지 관리 중입니다.표시 할 때까지 백그라운드에서 창로드하기

사용자는이 이전 창과 아직 구현되지 않은 새 기능을 선택할 수있는 프런트 화면을 추가해야합니다.

가 이

그래서, DB 쿼리 및 기타 이전 코드의 일부를 리팩토링 외에, 나는이 수행하여이 윈도우의 로딩 시간을 향상시키고 자 :

  1. 사용하면 앞 화면을 입력
  2. 느린에게 로드 윈도우는 현재와 마찬가지로 로딩을 시작하지만 프론트 스크린 윈도우가 활성화되어있는 동안 다른 스레드의 백그라운드에서 숨겨집니다. 사용자가 실제로 버튼을 클릭하여 윈도우를 열기 전에 윈도우가 완전히로드 된 경우에는 여전히 숨겨져 있어야합니다.
  3. 사용자가 단추를 클릭하여 창을 열면 이미로드되어 준비가되었으므로 즉시 표시됩니다.

이 내가 가진 것입니다 : 내가 위에서 설명한 두 개의 창 (전면 스크린과 느린 로딩)은 별도의 프로젝트에 있기 때문에) (Application.Run을 사용하고

private void startBackgroundLoading() 
{ 
var myThread = new Thread(openSlowLoadingWindow); 
myThread.SetApartmentState(ApartmentState.STA); 
myThread.Start(); 
} 

private void openSlowLoadingWindow() 
{ 
System.Windowns.Forms.Application.Run(new SlowWindow()); 
} 

.

분명히 위의 코드는 새로운 스레드를 시작하고로드가 완료되면 나에게 윈도우를 보여줄 것입니다. 그러나 위에서 설명한 것처럼 실제로 표시해야 할 때가 있습니다.

백그라운드에서 새 스레드를 실행하고 창과 다양한 다른 것들을 숨기려면 여러 가지 방법을 시도했습니다.

프로그래밍에 익숙하지 않아 완전히 잘못된 각도에서 공격하는 경우 개선 방법을 알려 주시기 바랍니다.

.net 4.0에 바인딩되었으므로 새 비동기/대기중인 항목이 옵션이 아닙니다.

안부, 에릭

+1

정상적인 방법으로 작동한다고 표시하는 것이 좋을까요? SlowWindow win = 새로운 SlowWindow(), 실제로 표시하고자 할 때마다 SlowWindow.Show()를 호출하십시오. –

+1

생성자 또는 window_loaded 이벤트에 느린 로딩 코드가 있습니까? –

+3

물론 이것은 아무 것도 해결하지 못합니다.로드하는 것과 마찬가지로 느립니다. 임의로 * 처음 * 창을 표시하고 * 작업자 스레드에서 쿼리를 실행할 수 있습니다. 그렇게해도 더 빨리 진행되지는 않지만 더 좋아 보이지만 사용하기가 어렵습니다. 더 나은 UI를 만들어 문제를 해결하십시오. 사람이 쿼리 실행 시간의 몇 초 분량을 생성 할 수있는 데이터 양을 뚫고 나가는 시나리오는 없습니다. –

답변

1

당신이 만드는 (그러나 실행되지 않음) 필요할 때 단순히이 창을 보여주는 다음 병렬 스레드에서 느린 로딩 창을 시도?

데이터베이스 호출과 창 표시의 느린 측면이 창의 생성자에있는 시나리오에서 작동합니다.

0

당신은 느린 형태로이 이벤트 핸들러를 추가 할 수 있습니다

private void SlowWindow_Shown(object sender, EventArgs e) 
    { 
     Hide(); 
    } 

그리고 전면 화면에서 호출하는이 방법을 추가

public void ShowCrossThread() 
    { 
     this.Invoke(new Action(() => { Show(); })); 
    } 

그런 다음 앞 화면에서 다음을 수행해야합니다 다음을 수행하십시오.

SlowForm _slowForm; 

    private void openSlowLoadingWindow() 
    { 
     _slowForm = new SlowForm(); 
     System.Windows.Forms.Application.Run(_slowForm); 
    } 

    private void btnSlowForm_Click(object sender, EventArgs e) 
    { 
     _slowForm.ShowFromThread(); 
     Hide(); 
    } 
관련 문제