0

我想显示一个带有进度条选框的新表单。这个表单应该在另一个线程上,因为调用的动作太大,如果它在同一个线程上,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();
    }

我想知道我做错了什么。

谢谢!

4

1 回答 1

3

你有几个问题:

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

您需要在 UI 线程中显示论坛,并在后台线程中运行长时间运行的任务。

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

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

于 2012-07-25T18:03:24.360 回答