代码之家  ›  专栏  ›  技术社区  ›  MoreThanChaos

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

  •  5
  • MoreThanChaos  · 技术社区  · 16 年前

    在我的应用程序中,我有一个线程显示了一段时间的“请等待”对话框窗口,有时它的时间非常少,在绘制UI时出现了一些问题(我猜)。

    我得到异常“线程被中止”,完全不知道如何处理它。我的意思是以某种方式捕获那个异常,或者以其他方式对用户隐藏它。这个例外与我的应用程序的其他部分没有任何关系,这个错误无论如何都不会影响它。随机出现,很难在通话中重新创建。

    我用各种方法试图在代码的一侧捕获这个异常,该代码使用对话框窗口启动和停止线程,但似乎错误显然是在另一个线程的一侧,该线程显示我新创建的线程中的窗口。

    这是一个代码示例,静态类的一部分,包含有用的东西,当然我不认为这是解决这种“忙碌”情况的好方法,但是我想解决这个问题。thread.sleep(500);或者其他尝试/捕捉的改进不能帮助我避免线程异常。

        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 回复  |  直到 16 年前
        1
  •  15
  •   Lasse V. Karlsen    16 年前

    使用thread.abort。此方法是为.NET运行时需要强制终止线程以卸载程序而保留的。

    只有当您要卸载AppDomain并希望首先除去其中运行的线程时,才可以“安全地”使用它。

    要除去线程,请以合作模式编写它。这意味着线程应该定期检查某种标志,如果设置了该标志,则通常退出线程方法。要“杀死”线程,只需设置标志并等待线程退出。

    您可以将事件对象或简单的布尔变量用于此标志。

    但是 不要使用线程。中止 .

        2
  •  1
  •   Steven A. Lowe    16 年前

    使用 SafeThread 把shouldreportthreadabort设为false,使问题消失……

    一个更好的解决方案是在调试器中运行它,并检查所有异常类型的异常,然后找出中止线程所发生的情况。

    编辑:感谢您发布代码示例,这使得问题更容易看到。 不要调用线程。中止

        3
  •  0
  •   joshua.ewer    16 年前

    同意史蒂文关于在抛出时打开所有异常的想法。然后你就可以立即看到问题了。

    需要记住的一点是,如果您的Visual Studio设置为“常规”而不是“Visual C开发人员”设置,那么您将没有调试菜单选项。如果我在一台新机器上或使用一个新的配置文件,仍然会抓住我…

        4
  •  -3
  •   Veldmuis    16 年前

    你可以试着打电话

    Thread.Sleep(500);
    

    之后

    backgroundOpertionThread.Start();
    

    这将给后台线程500毫秒的时间来做它需要做的事情,然后主线程才有机会调用

    backgroundOpertionThread.Abort();
    

    编辑:但我同意最好的解决方案是根本不使用thread.abort()。