2016-09-28 41 views
0

当我在一个漫长的过程中使用被调用的等待窗体的线程时,出现了错误。错误:线程在c#Windows应用程序中被中止

“的类型 'System.Threading.ThreadAbortException' 未处理的异常出现在 System.Windows.Forms.dll中

其他信息:线程已被中止。”

有时我的代码运行良好,但有时会出现此错误。

class ProgressCLS 
{ 
    private static Thread th = new Thread(new ThreadStart(showProgressForm)); 
    public void startProgress() 
    { 
     th = new Thread(new ThreadStart(showProgressForm)); 

     th.Start(); 
    } 

    private static void showProgressForm() 
    {    
       Waiting sForm = new Waiting();    
       sForm.ShowDialog(); 
    } 

    public void stopProgress() 
    { 
      th.Abort(); 
      th = null;   
    } 


} 

我得到了showProgressForm()方法这个错误在sform.ShowDialog()线

,我叫这个类的主要程序是这样的:

ProgressCLS PC = new ProgressCLS(); 
PC.startProgress(); 
TodayDate = txtDate.SelectedDateTime.ToString("yy-MM-dd"); 
ClearField(); 
CalculateMSG(); 
tabControl1.SelectedIndex = 1; 
btnShowFolderLocal.Enabled = true; 
btnShowFolderTop.Enabled = true; 
btnShowDpsFailed.Enabled = true; 
btnShowDpsFailed2.Enabled = true; 
btnShowFolderTopic.Enabled = true; 
ShowMSGButtonClicked = true; 
PC.stopProgress(); 

什么想法?

+0

这是因为你使用了Thread.Abort(),并且你有一个try/catch-em-all语句,你没有发布。不要捕获ThreadAbortException。 –

+0

您不需要单独的线程来显示进度表单。用'Show'而不是'ShowDialog'显示*非模态*形式。如果要报告其他任务/线程的进度,请使用“进度”并订阅其事件 –

+0

[C#窗体控件不会使用多线程更新]的可能重复(http://stackoverflow.com/questions/38588884/ c-sharp-form-controls-wont-update-with-multithreading) –

回答

1
private static Thread th = new Thread(new ThreadStart(showProgressForm)); 
public void startProgress() 
{ 
    th = new Thread(new ThreadStart(showProgressForm)); 
    th.Start(); 
} 

不是什么大不了的,但为什么你实例化你的线程两次?不是很干净。 我认为只有你的ctor中的一个是强制性的,因为你在调用stopProgress()时设置了th = null。

反正看你的代码,并记住线程是异步的,因此:

 ProgressCLS PC = new ProgressCLS(); 
     PC.startProgress(); 

它运行在一个专用线程的进度表(异步的,所以你的代码仍然在运行)。

TodayDate = txtDate.SelectedDateTime.ToString("yy-MM-dd"); 
    ClearField(); 
    CalculateMSG(); 
    ... 

你在主线程中执行过程的系列(synchrounously,你的进步仍形式在后台运行)。

 PC.stopProgress(); 

无论进度表的状态如何,它都会中止。正如你可能错过了MSDN documentation,它“在调用它的线程中引发一个ThreadAbortException”。因此,公平地说,你的代码“有时候工作”甚至是奇怪的,因为如果它碰到th.Abort()行,它应该失败。

这里有几个提示:

  • 我们通常运行在主线程UI形式,并在后台处理
  • 以您目前的设计中,你可能会遇到麻烦,如果你们中的任何处理(克利尔()和CalculateMSG())具有异步操作。
  • 您很少需要明确地中止一个线程(只有在出现意外错误时)。当进展完成时,只需关闭表格,Gargbage Collector就可以完成剩下的工作。
+0

你是对的。但我做到了,但没有工作 –

+0

答案更新更清晰。 – Ouarzy

+0

@MajidQafouri你为什么使用单独的线程?当我使用show()而不是showDialog()时,只需调用'Show()'而不是ShowDialog()' –

相关问题