2011-08-16 50 views
1

我有一個C#表單,初始化時間需要一段時間(從服務器獲取信息,並填充TreeView)。眼下,代碼類似於此:C#窗體:初始化需要很長時間時如何顯示錶單?

public class myForm : Form 
{ 
    InitializeComponent(); 
    List<Location> locations = getServerLocations(); // Server call 

    foreach(Location loc in locations) 
    { 
     List<POI> POIs = loc.getLocationPOIs(); // Server call 
     foreach(POI poi in POIs) 
     { 
      List<POIDetails> = poi.getPOIDetails(); // Server call 
      .... 
     } 
    } 
} 

你我想......因此,有一個大的樹的點,我知道我不能打的電話一路下跌,直到用戶展開那個樹。但是我的意圖是我只想讓表單顯示出來,並在工具條上加載一個'loading ...'或其他東西,而所有的處理和服務器都會發生。

現在,好像我還沒有加載應用程序,因爲在所有的調用完成之前沒有任何東西會顯示給用戶。

+0

這是因爲你在單線程中做所有事情。 – 2011-08-16 01:50:02

+0

什麼是C#表單?你的意思是Windows窗體? –

回答

7

您不應該在UI線程上進行任何長時間運行的處理,而應將其移至另一個線程,即使用BackgroundWorker。您最初可以顯示「加載」屏幕,一旦後臺工作完成,用您的樹形結構更新您的用戶界面。

+0

+1。打敗我吧。 – 2011-08-16 01:50:40

+0

如果您感興趣,還可以使用BackgroundWorker在加載屏幕中製作進度條。 – PythEch

0

在單獨的線程上運行初始化是首選方式。但是如果你被迫在UI線程上運行它,那麼在你調用窗體的.Show()或.ShowDialog()之後立即調用Application.DoEvents()。

如果表單出現,它將仍然對用戶操作沒有響應,直到初始化完成。因此,在單獨的線程上運行初始化是更好的解決方案。

相關問題