2013-10-07 141 views
3

我正在使用線程在我的程序的後臺運行計算。我在我的程序開始時啓動線程。如果我在線程完成之前按下按鈕,將會打開statusBar並將「openedStatus」設置爲true。後臺線程完成後C#執行方法

這將顯示線程目前的進展和線程完成後,我想執行我的代碼的最後一部分:

if (openedStatus) 
{ 
    sb.Close(); 
    validateBeforeSave(); 
} 

的這部分代碼將拋出一個異常,但因爲你可以」關閉狀態欄跨線程。

現在的問題是:如何在線程完成後執行代碼的最後部分?

private StatusBar sb = new StatusBar(); 
private void startVoorraadCalculationThread() 
{ 
    sb.setMaxProgress(data.getProducten().getProductenCopy().Count); 
    Thread thread = new Thread(new ThreadStart(this.run)); 
    thread.Start(); 
    while (!thread.IsAlive) ; 
} 

private void run() 
{ 
    for (int i = 0; i < data.getProducten().getProductenCopy().Count; i++) 
    { 
     sb.setProgress(i); 
     sb.setStatus("Calculating Voorraad: " + (i+1) + "/" + data.getProducten().getProductenCopy().Count); 
     data.getProducten().getProductenCopy()[i].getTotaalVoorraad(data.getMaten()); 
    } 
    if (openedStatus) 
    { 
     sb.Close(); 
     validateBeforeSave(); 
    } 
    calculationFinished = true; 
} 
+0

移動的最後一部分回你的主線程?爲什麼不使用背景工作? – Bolu

+0

是的,但是如果我將最後一部分移回,則無法檢查線程是否已完成執行,是嗎? 我會看看背景工作,謝謝。 – Duckdoom5

+0

我想'Thread.IsAlive'會告訴你線程是否完成/中止。但是,'BackgroundWorker'更容易 – Bolu

回答

3

使用BackgroundWorker的固定我的問題:

private void startVoorraadCalculationThread() 
{ 
    sb.setMaxProgress(data.getProducten().getProductenCopy().Count); 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bw_RunWorkerCompleted); 

    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    for (int i = 0; i < data.getProducten().getProductenCopy().Count; i++) 
    { 
     sb.setProgress(i); 
     sb.setStatus("Calculating Voorraad: " + (i + 1) + "/" + data.getProducten().getProductenCopy().Count); 
     data.getProducten().getProductenCopy()[i].getTotaalVoorraad(data.getMaten()); 
    } 
} 

private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (openedStatus) 
    { 
     sb.Close(); 
     validateBeforeSave(); 
    } 
    calculationFinished = true; 
} 
相關問題