2013-07-03 47 views
1

如何在我的Windows Form中爲計數行執行多行讀取?在C#中使用Windows窗體的實時計數器

當我執行我的Windows Form這個計數器會在應用程序處理每個數據時顯示。

示例代碼

public Form1() 
    { 
     InitializeComponent(); 
     setMessage(string.Empty, this.lblErro); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
    for (int i = 0; i <= xmlnode.Count - 1; i++) 
    { 
      int cont = i;      

      ThreadPool.QueueUserWorkItem(_ => 
      { 
       setMessage(++cont + " of " + xmlnode.Count, this.lblCounter);       
      }); 
     } 

     void setMessage(string message, Label lbl) 
     { 
      if (InvokeRequired) 
      { 
       Invoke((MethodInvoker)(() => setMessage(message, lbl))); 
      } 
      else 
      { 
       lbl.Text = message; 
      } 
     } 
    } 

我tryied以上,但沒有成功的代碼。仍顯示該消息時,應用程序處理的所有數據

+4

您需要從UI線程運行循環。 – SLaks

+0

該代碼肯定是錯誤的。它沒關係,它只是眨眼之間就結束了。 –

+0

@HansPassant這只是一個示例,在我的循環中,我有很多驗證,並且在我的數據庫中進行了大量研究,爲了便於理解,我在此處進行了限制。 –

回答

2

你需要運行這個循環:

for (int i = 0; i <= xmlnode.Count - 1; i++) 
{ 
    ... 
} 

關閉主UI線程的。有很多方法可以實現這一點,但我更喜歡BackgroundWorker出於任何原因。你可以做這樣的:

BackgroundWorker _worker = new BackgroundWorker(); 

然後在ctor

_worker.DoWork += (s, e) => 
{ 
    // place the entire for loop in here 
} 

,現在當你準備運行它,然後只是這樣做:

_worker.RunWorkerAsync(); 
+0

正常工作,就像@StenPetrov的另一個答案。就像你說的,有很多方法可以實現這一點,但是你能告訴我爲什麼你更喜歡'BackgroundWorker'嗎? –

+0

@Lucas_Santos,'BackgroundWorker'非常強大,因爲它支持切換線程以及取消進度報告。它也可以在早期的框架中使用,而不是'async' /'await'模式。 –

0

嘗試把內環路:

ThreadPool.QueueUserWorkItem(_ => { 
    for (int i = 0; i <= xmlnode.Count - 1; i++) 
    { 
      int cont = i; 
      setMessage(++cont + " of " + xmlnode.Count, this.lblCounter);       

    } 
}); 
相關問題