2013-01-24 39 views
0

我有一個程序,在工作時顯示其不同圖標的進度。該過程是通過按下btnApply buton開始的。c#ThreadPool/WaitCallback - 在這種情況下如何委派?

ManualResetEvent[] wait; 

    private void btnApply_Click(object sender, EventArgs e) 
    { 
     wait = new ManualResetEvent[1]; 
     wait[0] = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(doApply), 0); 
     WaitHandle.WaitAny(wait); 
     btnApply.Text = "Done!"; 
    } 

    private void doApply(object dummy) 
    { 
     for (int i = 0; i < 14; i++) 
     { 
      setPic(i, bmTODO); 
     } 
     // do something 
     for (int i = 0; i < 14; i++) 
     { 
      setPic(i, bmWORK); 
      // do something 
      setPic(i, bmOK); 
     } 
    } 

    public void setPic(int i, Image img) 
    { 
     switch (i) 
     { 
      case 0: pictureBox1.Image = img; break; 
      case 1: pictureBox2.Image = img; break; 
      case 2: pictureBox3.Image = img; break; 
      case 3: pictureBox4.Image = img; break; 
      case 4: pictureBox5.Image = img; break; 
      case 5: pictureBox6.Image = img; break; 
      case 6: pictureBox7.Image = img; break; 
      case 7: pictureBox8.Image = img; break; 
      case 8: pictureBox9.Image = img; break; 
      case 9: pictureBox10.Image = img; break; 
      case 10: pictureBox11.Image = img; break; 
      case 11: pictureBox12.Image = img; break; 
      case 12: pictureBox13.Image = img; break; 
      case 13: pictureBox14.Image = img; break; 
      default: break; 
     } 
    } 

隨着Win7和2處理器這個'它應該'的作品。
但在XP上我必須完成任務 - 但是我怎麼能在這個特殊的代碼中做到這一點?我不想在doApply中指定每個picturebox。

我也試圖與一個代表:

public delegate void setPicDelegate(int i, Image img); 

但沒有satistying結果:程序掛起或圖標在產品總數結束最近顯示。

我該怎麼辦?

回答

1

的問題是,你與阻塞UI線程:WaitHandle.WaitAny(wait);。您需要允許btnApply_Click方法在長時間運行任務完成之前結束,以允許UI線程處理新操作。

在UI環境中建模長時間運行的任務的一種簡單方法是使用BackgroundWorker,因爲它會爲您抽象掉很多問題。

DoWork事件處理程序中執行所有長時間運行的工作,並在使用RunWorkerCompleted事件完成工作時更新UI。該事件處理程序將在UI線程中運行。該類還支持將結果傳遞給UI,處理UI中改進的進度信息等等。

+0

謝謝你史蒂夫, 工作正常。 –

+0

但現在我有一個新的困難:
BackgroundWorker的具有打開一個新的形式,像一個消息框,但有更多的複雜的按鈕文本。我該怎麼去? 'r = myMessageBox(「Message」,「Caption」); .. 私人的DialogResult myMessageBox(字符串,字符串B) { 使用(My3MessageForm myForm的新= My3MessageForm(A,B)) { myForm.ShowDialog(); 如果(MessageSucceded) { 返回myForm.DialogResult; } 其他 { 回報DialogResult.Abort; } } }'
我該怎麼辦? –

+0

@MartinS你打開這個表單有什麼問題? – Servy