2013-10-07 92 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; 
} 
相关问题