我有以下问题:

我有一个名为MainForm的表单。我要对此表格进行长时间的操作。

在进行此长时间操作时,我需要在MainForm顶部显示另一个名为ProgressForm的操作。

ProgressForm包含一个进度条,在进行长时间操作时需要对其进行更新。

完成长时间的操作后,ProgressForm应该自动关闭。

我写了以下代码:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.Threading;

namespace ClassLibrary
{
    public class MyClass
    {
        public static string LongOperation()
        {
            Thread.Sleep(new TimeSpan(0,0,30));

            return "HelloWorld";
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace BackgroungWorker__HelloWorld
{
    public partial class ProgressForm : Form
    {
        public ProgressForm()
        {
            InitializeComponent();
        }

        public ProgressBar ProgressBar
        {
            get { return this.progressBar1; }
            set { this.progressBar1 = value; }
        }
    }
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

using ClassLibrary;

namespace BackgroungWorker__HelloWorld
{
    public partial class MainForm : Form
    {
        ProgressForm f = new ProgressForm();

        public MainForm()
        {
            InitializeComponent();
        }

        int count = 0;
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            if (f != null)
            {
                f.ProgressBar.Value = e.ProgressPercentage;
            }

            ++count;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled)
            {
                MessageBox.Show("The task has been cancelled");
            }
            else if (e.Error != null)
            {
                MessageBox.Show("Error. Details: " + (e.Error as Exception).ToString());
            }
            else
            {
                MessageBox.Show("The task has been completed. Results: " + e.Result.ToString());
            }
        }


        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            if (f == null)
            {
                f = new ProgressForm();
            }

            f.ShowDialog();

            //backgroundWorker1.ReportProgress(100);

            MyClass.LongOperation();

            f.Close();
        }

        private void btnStart_Click(object sender, EventArgs e)
        {
            backgroundWorker1.RunWorkerAsync();
        }

        private void btnCancel_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();

            this.Close();
        }
    }
}

我找不到更新progressBar的方法。

我应该在哪里放置backgroundWorker1.ReportProgress(),怎么称呼它?

我不可以对MyClass进行任何更改,因为我不知道会发生什么事情或需要多长时间才能完成应用程序这一层的操作。

谁能帮我?

最佳答案

一个问题是您要睡30秒钟。通常,您会在长时间运行的任务中的各个位置调用ReportProgress。因此,为了演示这一点,您可能需要将代码更改为睡眠1秒,但要更改30次-每次完成睡眠时调用ReportProgress

另一个问题是您正在从后台线程显示ProgressForm。您应该在UI线程中启动它,但是将后台工作程序的ProgressChanged事件挂接到它。然后,当后台工作人员报告进度时,进度表将被更新。

10-05 21:10