在我的应用程序中,我有一个显示一段时间"请等待"对话窗口的线程,有时这是一个非常小的时间,并且绘制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(); }
有任何想法吗?
千万不能使用Thread.Abort的.当.NET运行时需要强制终止线程以卸载程序时,保留此方法.
如果您要卸载AppDomain并且想要首先删除在其中运行的线程,则只能"安全地"使用它.
要删除线程,请以协作模式写入.这意味着线程应该定期检查某种标志,如果设置了标志,则通常退出线程方法.要"杀死"线程,只需设置标志并等待线程退出.
您可以为此标志使用Event-object或简单的boolean变量.
但是不要使用Thread.Abort.