如何将进度更改事件链接到进度条

时间:2011-09-26 12:48:18

标签: c# .net multithreading progress-bar backgroundworker

我有一个由WindowWorker运行类方法的Windows窗体应用程序。

我想在窗口中添加一个进度条来显示进度。

在类方法中我有一个foreach循环,所以我希望每个循环都发送表单事件

目前的百分比。

这就是我的所作所为:

public partial class Form1 : Form
    {
        Parsser inst;

        public Form1()
        {
            InitializeComponent();
            inst = new Parsser();
            backgroundWorker1.WorkerReportsProgress = true;
            backgroundWorker1.WorkerSupportsCancellation = true;
        }


        private void button2_Click(object sender, EventArgs e)
        {
            if (this.textBox1 != null & this.textBox2 != null)
            {
                if (backgroundWorker1.IsBusy != true)
                {
                    // Start the asynchronous operation.
                    backgroundWorker1.RunWorkerAsync();
                }
            }
        }



        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            inst.init(this.textBox1.Text, this.textBox2.Text);

            inst.ParseTheFile();
            System.Windows.Forms.MessageBox.Show("Parsing finish successfully");

        }
        private void backgroundWorker1_ProgressChanged(object sender,                ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

    }


}

`

在课堂上我这样做 -

public Parsser()
    {
        bgReports = new BackgroundWorker();
        bgReports.WorkerReportsProgress = true;
    }

    public void ParseTheFile()
    {
        Lines = File.ReadAllLines(FilePath);
        this.size = Lines.Length;
        foreach (string line in Lines)
        {

            bgReports.ReportProgress(allreadtchecked/size);

出于某种原因,它没有任何想法吗?

4 个答案:

答案 0 :(得分:1)

BackgroundWorker的引用传递给Parsser,然后使用该引用调用ReportProgrss方法

BackgroundWorker worker;

public Parsser(BackgroundWorker bg)
    {
        worker = bg;
    }

public void ParseTheFile()
{
    Lines = File.ReadAllLines(FilePath);
    this.size = Lines.Length;
    foreach (string line in Lines)
    {
        worker.ReportProgress(allreadtchecked/size);

答案 1 :(得分:1)

您正在Parsser类构造函数中创建一个重复的BackgroundWorkder实例。请尝试以下

private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        inst.init(this.textBox1.Text, this.textBox2.Text);
        inst.ParseTheFile(backgroundWorker1);
        System.Windows.Forms.MessageBox.Show("Parsing finish successfully");
    }

在Parsser课程中。

    public Parsser()
    {
        //Don't initialize backgroundworker here.
    }

    public ParseTheFile(BackgroundWorker bgWorker)
        {
            bgReports = bgWorker;
           .....
        }

答案 2 :(得分:1)

将lambda或方法传递给worker方法:

形式:

public void Run()
{
   myParse.DoWork(a => UpdateProgressBar(a.Progress));
}

private void UpdateProgressBar(int progress) { ... }

在Parser中:

public void Parse(Action<ProgressArgs> onProgress)
{
   // do your job
   // invoke onProgress whenever needed
   onProgress(current / total * 100);
}

答案 3 :(得分:0)

您需要将后台工作人员设置为通过DoWorkEventHandler进行工作。此外,看起来您的部分类的每一半都使用自己的BackgroundWorker。您需要使用相同的参考。你有bgreports和backgroundWorker1。

backgroundWorker1.DoWork += MyMethod;


// ......


private void MyMethod(object sender, DoWorkEventArgs e)
{
}

另外,为什么要测试文本框是否为null?您是否尝试将其文本字符串内容测试为null?如果是这样,我会使用String.IsNullOrEmpty。

我认为这里更好的设计将是您的“Parsser”(请修复拼写并确定此类对于Opertional代码的类型/目的)来定义您的消费者类将订阅的自己的事件。解析器不应该负责异步运行自身。消费者应该可以选择同步或异步地运行某些内容。在任何一种情况下,都可以定义和订阅自定义进程事件(再次,可选)。