单击按钮取消过程

时间:2012-01-06 12:26:15

标签: c# winforms

我写的项目中有一个过程。这需要时间,我想使用进度条。我想允许用户通过单击按钮取消进程和ProgressBar。我不希望用户在我的进程运行时能够单击该表单上的任何其他控件。如果我使用一个线程,那么用户可以单击表单上的其他控件。

也许一种解决方案是使用另一种形式,并在第二种形式上设置ProgressBar和取消按钮。但是如何根据我的进程设置ProgressBar的值,该进程参与第一个表单。

解决方案是什么?

提前致谢。

3 个答案:

答案 0 :(得分:2)

使用BackgroundWorker,这会提供用于报告进度和取消的API。

答案 1 :(得分:2)

最好通过对话框完成,它会自动使UI的其余部分无法访问。将新表单添加到项目中,并在其上放置ProgressBar和Button。并添加一个公共方法,以便您可以从主窗体中的事件处理程序更新进度条:

public partial class ProgressDialog : Form {
    public ProgressDialog() {
        InitializeComponent();
    }
    public void ShowProgress(int progress) {
        progressBar1.Value = progress;
    }
    private void CancelProcess_Click(object sender, EventArgs e) {
        this.DialogResult = DialogResult.Cancel;
    }
}

启动工作人员时需要显示对话框:

    ProgressDialog dlg;

    private void RunProcess_Click(object sender, EventArgs e) {
        backgroundWorker1.RunWorkerAsync();
        using (dlg = new ProgressDialog()) {
            dlg.ShowDialog(this);
        }
        dlg = null;
        if (backgroundWorker1.IsBusy) backgroundWorker1.CancelAsync();
    }

请注意它如何调用CancelAsync()来停止工作程序,因此关闭对话框足以使其停止。您需要更新进度条:

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e) {
        dlg.ShowProgress(e.ProgressPercentage);
    }

当工作人员完成并且用户没有自己关闭对话框时,您需要自动关闭对话框:

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) {
        if (dlg != null) dlg.Close();
    }

答案 2 :(得分:1)

使用BackgroundWorker。将其添加到您的第一个表单并在BackgroundWorker上更改事件更改进度条值。查看文档中显示的示例。