0

我正在开发 C# win 表单应用程序。我的问题是,当我点击菜单时,我创建了一个单独的线程来显示进度(启动进度表)。当我中止线程时,进度表仍然显示..!但是当我将鼠标指针移到表单上时,它会立即消失..!

以下是我的代码

Thread progressThread = new Thread(() => Application.Run(new frmOperationProgress()));

progressThread.IsBackground = true;
progressThread.Start();
//Some work
progressThread.Abort();

如何在 C# 中关闭此进度表单对象

4

3 回答 3

1

问题在于使用Abort- 通常不建议这样做,因为不能保证它会按照您的预期进行(在您的情况下隐藏表单)。

最好在您的线程中添加适当的取消支持并直接处理隐藏启动屏幕。

于 2013-11-05T09:30:24.767 回答
1

请永远不要使用 Abort()。这种工作最好通过 BackgroundWorker 完成;如果你坚持使用 Thread

尝试:

var form = new frmOperationProgress();
Thread progressThread = new Thread(() => Application.Run(form));
progressThread.IsBackground = true; 
progressThread.Start();
//Some work
form.ExternalClose();

其中 ExternalClose 是这样的形式方法:

public void ExternalClose() {
  if (InvokeRequired) {
    Invoke(new MethodInvoker(() => { ExternalClose(); }));
  } else {
    Close();
  }
}

使用 BackgroundWorker 的解决方案:

在后台工作人员中,您必须在 ProgressChanged 事件(在 UI 线程中运行)中执行 UI 工作,并在 DoWork 事件(后台线程)中执行脏活。

FormMain.cs:(具有单个 BackgroundWorker 控件的表单,名为“backgroundWorker1”,连接事件 backgroundWorker1_DoWork、backgroundWorker1_ProgressChanged 和 WorkerReportsProgress 设置为 true)

using System.ComponentModel;
using System.Threading;
using System.Windows.Forms;

namespace ConsoleApplication1 {
  public partial class FormMain : Form {
    private FormProgress m_Form;
    public FormMain() {
      InitializeComponent();
      backgroundWorker1.RunWorkerAsync();
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) {
      backgroundWorker1.ReportProgress(0, "hello");
      Thread.Sleep(2000);
      backgroundWorker1.ReportProgress(20, "world");
      Thread.Sleep(2000);
      backgroundWorker1.ReportProgress(40, "this");
      Thread.Sleep(2000);
      backgroundWorker1.ReportProgress(60, "is");
      Thread.Sleep(2000);
      backgroundWorker1.ReportProgress(80, "simple");
      backgroundWorker1.ReportProgress(100, "end");
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
      if (e.ProgressPercentage == 0 && m_Form == null) {
        m_Form = new FormProgress();
        m_Form.Show();
      }

      if (e.ProgressPercentage == 100 && m_Form != null) {
        m_Form.Close();
        m_Form = null;
        return;
      }

      var message = (string)e.UserState;
      m_Form.UpdateProgress(e.ProgressPercentage, message);
    }
  }
}

其中 FormProgress 是简单的表单,带有 ProgressBar progressBar1 和 Label label1 以及一个额外的方法:

public void UpdateProgress(int percentage, string message) {
  this.progressBar1.Value = percentage;
  this.label1.Text = message;
}
于 2013-11-05T09:31:31.100 回答
0

您只需关闭表单,线程(被该表单的消息循环阻塞)将自然结束:

var yourForm = new frmOperationProgress();
//Start it
Thread progressThread = new Thread(() => Application.Run(yourForm));
progressThread.IsBackground = true;
progressThread.Start();
//....
//close it
yourForm.Invoke((Action)(() => yourForm.Close()));
于 2013-11-05T19:04:58.897 回答