2013-03-12 94 views
2

我有一段代碼從我的SQL服務器獲取可用服務器實例到DataTable。這將需要一些時間來填充。所以我試圖添加一個進度條來指示時間。有一些方法可以做到這一點:具有計時器的進度條

1.使用後臺工作
2.使用定時器

我用了一個定時器,但進度條沒有動畫。

我的代碼是(WinForm的):

private void frmCodeGenerator_Load(object sender, EventArgs e) 
    { 
     Cursor.Current = Cursors.WaitCursor; 
     tmrWaiting.Enabled = true; 
     tmrWaiting.Start(); 

     //List all available servers 
     PopulateServerInstances(); 
     //List all default namespaces to import 

     //Set the target folder default path tec. 

     tmrWaiting.Stop(); 
     Cursor.Current = Cursors.Default; 
    } 

private void tmrWaiting_Tick(object sender, EventArgs e) 
     {    
      pbWaiting.Value++; 
     } 

光標正在改變形式正常的等待狀態,但進度條沒有。我在做賴特嗎?

+0

您是否設置了「pbWaiting.Maximum」? – Nolonar 2013-03-12 09:36:46

+0

是的。從visual studio屬性編輯器。 'pbWaiting.Maximum = 100'和'pbWaiting.Visible = true' – Irshad 2013-03-12 09:39:52

+0

你在用什麼INTERVAL?如果它太大,可能是它在任務完成時沒有開火?而且,無論實際進度如何,這都會計算在內。這只是虛擬代碼? – Belogix 2013-03-12 09:45:55

回答

2

您的Load事件處理程序正在您的UI線程上運行,它正在調用PopulateServerInstances,這可能是在加載數據時阻塞的。您需要在BG線程上完成這項工作,以便您的UI線程可以繼續更新UI。 BackgroundWorker是你最好的選擇,因爲它包括支持更新UI線程上的進度信息。

+0

我不確定'Load'事件處理程序。我有一個Winforms,它的大部分工作在它的'Load'事件中,並且其中的進度條工作得很好(雖然進度條正在通過代理在後臺線程中更新) – Nolonar 2013-03-12 09:53:07

+0

作爲附加點,您的表單在填充方法完成之前不會顯示。 – fofik 2013-03-12 09:53:50

+0

@Nolonar:如果你定期調用Application.DoEvents()抽取所有的UI事件,或者你的處理程序被編組到另一個線程,那麼這隻會有意義。 – 2013-03-12 09:54:38