多线程:新表格关闭太快

时间:2012-07-25 17:58:08

标签: c# multithreading forms progress-bar marquee

我想用进度条选框显示一个新表单。此表单应位于其他线程上,因为调用的操作太大,如果进度条位于同一线程上,则UI不会更新进度条。

我调用一个新线程,创建我的表单,但一出现,表单就会关闭......

以下是我的主要代码:

    frmProgress f = new frmProgress();
    Thread t = new Thread(new ThreadStart(delegate() { f.Show(); }));
    t.Start();
    documentManager.Compile(); //This is my big action
    t.Abort();

以下是表格代码:

    public frmProgress()
    {
        InitializeComponent();
    }

我想知道我做错了什么。

谢谢!

1 个答案:

答案 0 :(得分:3)

你有几个问题:

  1. 您正在非UI线程中显示表单。这只会引起问题;它需要在UI线程中。
  2. 您正在UI线程中执行长时间运行的任务;这是阻止UI更新。
  3. 您需要在UI线程中显示论坛,并在后台线程中运行长时间运行的任务。

    这里工作的一个很好的工具是使用BackgroundWorker。它将为您完成大部分工作,以确保正确的代码在UI /非UI线程中运行。创建一个新的BackgroundWorker并将长时间运行的任务放在DoWork事件中。在启动BGW之前进行所需的任何简单UI更新(显示表单),并在Completed事件(将在UI中运行)中进行任何清理。 MSDN page on BackgroundWorker有一些nice examples

    使用BackgroundWorker的另一个好处是,您可以轻松报告进度(如果您有一个很好的方法来了解您的完成百分比),而不仅仅是有一个选框栏。只需向ProgressReported事件处理程序添加一个处理程序即可更新进度条,并在执行工作时定期调用ReportProgress方法。有关确切的代码段,请参阅链接的示例。