显示对话框时“线程被中止”异常

时间:2008-10-21 03:06:50

标签: c# .net multithreading .net-2.0

在我的应用程序中,我有一个显示一段时间“请等待”对话窗口的线程,有时这是一个非常小的时间,并且在绘制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();
    }

有什么想法吗?

4 个答案:

答案 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()