进度条和ThreadAbortException

本文关键字:ThreadAbortException | 更新日期: 2023-09-27 18:22:09

我有两种形式。带有一些代码的主窗体和带有进度条的2窗体。当主形式工作时,它变得不可见,而作为线程的第二种形式出现了:

 Thread pb = new Thread(Show_pb); //Show_pb shows the 2 form with green progress bar
 pb.Start();
 this.ShowInTaskbar = false;
 this.Visible = false;
 //do smth...
  pb.Abort();        
  this.Visible = true;
  this.ShowInTaskbar = true;
  this.Activate();

毕竟,有时它会抛出一个异常:

线程正在中止

如果我在Show_pb中创建try..catch,它每次都会抛出:

    try
    {
        Form2 f_pb = new Form2();
        f_pb.ShowDialog();
        f_pb.Activate();
    }
    catch (Exception ex)
    {
        throw ex;
    }

但我无法处理系统抛出的异常。我应该更改什么或如何处理此异常?

进度条和ThreadAbortException

请参阅ThreadAbortException class:的文档

当调用Abort方法来销毁线程时公共语言运行库抛出ThreadAbortException。ThreadAbortException是一个可以捕获的特殊异常,但它将在卡块的末端自动再次升高。

您无法有效地捕获此异常。

第一件事是,除非您的整个应用程序都关闭了,否则您永远不应该调用Thread.Abort。它还可能使您的应用程序处于未知状态。

接下来的事情是,您似乎正在非UI线程中启动一些UI。太糟糕了。你真的不应该那样做。

正确的方法是在后台线程中运行计算,并将更新封送回UI以更新进度条。