2012-06-21 56 views
2

我保持一個較舊的WinForms應用程序,其中第一窗口需要3-5秒鐘的加載,由於數據庫查詢,數據網格的自定義和加載大量數據英寸加載在後臺窗口,直到告訴它顯示

我應該添加一個前臺屏幕,用戶可以在這個舊窗口和尚未實現的新功能之間進行選擇。

因此,除了重構了一些數據庫查詢和其他舊的代碼,我想這樣做是爲了提高該窗口的加載時間:

  1. 用戶進入前屏幕
  2. 慢加載窗口開始加載,就像現在一樣,但隱藏在另一個線程的後臺,而前臺窗口處於活動狀態。如果在用戶實際點擊按鈕打開窗口之前窗口已經完全加載,那麼它仍然應該隱藏。
  3. 如果用戶點擊按鈕打開窗口,它會立即顯示,因爲它已經加載並準備就緒。

這是我有:

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

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

我使用Application.Run(),因爲上面所示的兩個窗口(前屏幕和緩慢的加載)在不同的項目。

很明顯,上面的代碼會啓動新線程,並在完成加載時向我顯示窗口,但如上所述,我想告訴它何時實際顯示自己。

我試過幾種方法在後臺運行新線程,隱藏窗口和其他各種東西。

我對編程相對比較陌生,所以如果我從完全錯誤的角度來攻擊它,請告訴我如何改進。

我被綁定到.net 4.0,所以新的異步/等待的東西不是一個選項。

最好的問候,埃裏克

+1

我想只是聲明並顯示它正常的方式將工作? SlowWindow win = new 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(); 
    }