2015-06-20 153 views
-3

好吧,很簡單,創建一個窗口窗體,放入一個按鈕和一個標籤,並給這個按鈕一個點擊事件。標籤中的循環bug

private void button1_Click(object sender, EventArgs e) 
    { 
     int xa; 
     int ya; 
     for (xa = 647; xa < 982; xa++) 

      for (ya = 262; ya < 598; ya++) 
      { 
       label1.Text = xa.ToString() + " " + ya.ToString(); 
      } 
    } 

和程序只是約20秒,當我點擊按鈕。我怎樣才能解決這個問題?

+0

發生這種情況是因爲你在UI線程上做了一個很長的任務。看看'BackgroundWorker','async'和'StringBuilder'作爲獎勵。 – SimpleVar

+0

現在你的問題是「如果你運行需要花費一些時間和重複多次的代碼,需要很長時間,如何修復它?」你可能想澄清你實際上想要達到什麼... –

+0

我沒有看到我放入按鈕是一個長期的任務,它只是一個300x300的運行,但我想在這個程序中看到的是,y在程序中立即增加正在運行,而不是完成時。 – Tranoze

回答

1

你必須從UI線程中獲得它。試試這個:

private void button1_Click(object sender, EventArgs e) 
{ 
    ThreadPool.QueueUserWorkItem(p => doit());    
} 

private void doit() 
{ 
    int xa; 
    int ya; 
    for (xa = 647; xa < 982; xa++) 

     for (ya = 262; ya < 598; ya++) 
     { 
      this.Invoke(new Action(() => { label1.Text = xa.ToString() + " " + ya.ToString(); })); 
     } 
} 
+1

中發現了一個類似的問題,這個變化所做的唯一的事情是,由於線程之間不斷的回調,使得它變得更慢......不知道這將是多麼有幫助。 .. –

+0

@AlexeiLevenkov - 速度較慢,真實。線程編組並不便宜。這取決於目標是什麼。我認爲OP正試圖在處理時處理無響應的UI。 – sarme

+0

工作線程上的小睡會給UI線程渲染機會......顯然不是最好的解決方案(應該使用計時器),但是沒問題。 –