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

C# 如何将进度更改事件链接到进度条,c#,.net,multithreading,progress-bar,backgroundworker,C#,.net,Multithreading,Progress Bar,Backgroundworker,我有一个运行BackgroundWorker的类方法的windows窗体应用程序 我想在进度栏中添加windows窗体以显示进度 在类方法中,我有一个foreach循环,因此我希望每个循环发送表单事件 使用当前百分比 我就是这么做的: public partial class Form1 : Form { Parsser inst; public Form1() { InitializeComponent();

我有一个运行BackgroundWorker的类方法的windows窗体应用程序

我想在进度栏中添加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);

出于某种原因,它不起任何作用?

您需要设置您的后台工作人员,以便通过
dowworkeventhandler
进行工作。此外,部分类的每一半似乎都在使用自己的BackgroundWorker。您需要使用相同的引用。您有bgreports和backgroundWorker1

backgroundWorker1.DoWork += MyMethod;


// ......


private void MyMethod(object sender, DoWorkEventArgs e)
{
}
还有,为什么要测试文本框是否为空?您是否正在尝试测试其文本字符串内容是否为空?如果是这样,我将使用String.IsNullOrEmpty


我认为这里更好的设计是为您的“Parser”(请修复拼写并确定该类用于操作代码的类型/用途)定义您的消费者类将订阅的自己的事件。解析器不应该负责异步运行自己。使用者应该可以选择同步或异步运行。在这两种情况下,都可以定义和订阅自定义进度事件(也可以选择)。

BackgroundWorker
的引用传递到
Parser
,然后使用该引用调用
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);

您正在Parser类构造函数中创建重复的BackgroundWorker实例。试试下面

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");
    }
在帕瑟班

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

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

将lambda或方法传递给工作方法:

形式:

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

private void UpdateProgressBar(int progress) { ... }
在解析器中:

public void Parse(Action<ProgressArgs> onProgress)
{
   // do your job
   // invoke onProgress whenever needed
   onProgress(current / total * 100);
}
public void解析(操作onProgress)
{
//做好你的工作
//需要时调用onProgress
进度(当前/总计*100);
}

我更改代码,并将backgroundWorker1发送给Parser constractor。在Parser类中,我调用bgrepts.ReportProgress(allreadtchecked/size);并尝试通过私有的void backgroundWorker1\u ProgressChanged捕获此事件,但它仍然无法到达私有的void backgroundWorker1\u progresschange。BG报告说,此答案仍然使用第二个BackgroundWorker。你真的不应该让两个班共享一个工人,也不应该让第二个工人。那么答案应该是什么呢?我有一个我写的答案。当然,在不同的类之间共享BGworker是可行的,我只是觉得这是一个令人困惑和受限的设计选择。看起来哈里斯在我回复后就编辑了代码,所以他所做的应该是可行的,但是再一次,将设置、启动、报告进度和结束工人的责任分成两类是困难的。该类不具有合理的可测试性。