在我的应用程序中,我有一个显示一段时间“请等待”对话窗口的线程,有时这是一个非常小的时间,并且在绘制UI时会出现一些故障(我猜)。
我得到异常“线程被中止”并且完全不知道如何摆脱它。我的意思是以某种方式捕获异常,或者以某种其他方式将其隐藏在用户之外。此异常与我的应用程序的其余部分无关,并且该错误以任何方式不会影响它。随机出现,很难在通话中重新创建。
我尝试以各种方式通过代码来捕获该异常,该代码使用对话框窗口启动和停止线程,但似乎错误显然是在我新创建的线程中显示窗口的其他线程。
这是一个代码示例,静态类的一部分,有用的东西,当然我不是说这是解决这种“忙”情况的好方法,但我想解决这个问题。 Thread.sleep代码(500);或其他try / catch改进并没有帮助我避免该线程异常。
public static bool alreadyBusy = false;
public static BusyIndicator bi = new BusyIndicator("");
public static Thread backgroundOpertionThread;
public static void showBusy(bool isBusy, System.Windows.Forms.Form hostform, string message)
{
Common.busyMessage = message;
if (isBusy)
{
Common.alreadyBusy = true;
backgroundOpertionThread = new Thread(new ThreadStart(showBusy));
Thread.Sleep(500);
if (hostform != null)
{
hostform.Enabled = false;
hostform.SuspendLayout();
}
backgroundOpertionThread.Start();
}
else
{
backgroundOpertionThread.Abort();
Thread.Sleep(500);
Common.alreadyBusy = false;
if (hostform != null)
{
hostform.Enabled = true;
hostform.ResumeLayout();
}
}
}
public static void showBusy()
{
BusyIndicator bir = new BusyIndicator(Common.busyMessage);
bir.ShowDialog();
}
有什么想法吗?
答案 0 :(得分:15)
不使用Thread.Abort。当.NET运行时需要强制终止线程以卸载程序时,保留此方法。
如果您要卸载AppDomain并且想要首先摆脱在其中运行的线程,您只能“安全地”使用它。
要删除线程,请以协作模式写入。这意味着线程应该定期检查某种标志,如果设置了标志,则通常退出线程方法。要“杀死”线程,只需设置标志并等待线程退出。
您可以为此标志使用Event-object或简单的布尔变量。
但是不要使用Thread.Abort 。
答案 1 :(得分:1)
使用SafeThread并将ShouldReportThreadAbort设置为false以使问题消失......
更好的解决方案是使用Debug>>在调试器中运行它。例外>>抛出检查所有异常类型,并找出中止线程的行为
编辑:感谢发布代码示例,这使问题更容易看到。 请勿致电THREAD.ABORT答案 2 :(得分:0)
同意史蒂文关于在抛出时打开所有异常的想法。然后,您将能够立即看到问题。
重要的是要记住,如果您的visual studio设置是一般的,那么您将没有调试菜单选项,而不是“Visual C#Developer”设置。如果我在新机器上或使用新的配置文件,仍然会抓住我......
答案 3 :(得分:-3)
您可以尝试拨打
Thread.Sleep(500);
后
backgroundOpertionThread.Start();
这将为后台线程提供500毫秒的时间来完成主线程有机会调用之前需要做的事情
backgroundOpertionThread.Abort();
编辑:但我同意最好的解决方案是不要使用Thread.Abort()