错误:线程在c#Windows应用程序中被中止
当我在一个漫长的过程中使用被调用的等待窗体的线程时,出现了错误。错误:线程在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();
什么想法?
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就可以完成剩下的工作。
你是对的。但我做到了,但没有工作 –
答案更新更清晰。 – Ouarzy
@MajidQafouri你为什么使用单独的线程?当我使用show()而不是showDialog()时,只需调用'Show()'而不是ShowDialog()' –
这是因为你使用了Thread.Abort(),并且你有一个try/catch-em-all语句,你没有发布。不要捕获ThreadAbortException。 –
您不需要单独的线程来显示进度表单。用'Show'而不是'ShowDialog'显示*非模态*形式。如果要报告其他任务/线程的进度,请使用“进度”并订阅其事件 –
[C#窗体控件不会使用多线程更新]的可能重复(http://*.com/questions/38588884/ c-sharp-form-controls-wont-update-with-multithreading) –