2011-09-26 84 views
1

我有Windows窗体应用程序运行BackgroundWorker的类方法。如何将进度变更事件链接到进度条

我想添加窗口窗体进度条来显示进度。

在类方法

我有一个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); 
从某种原因,它不工作的任何想法

回答

1

BackgroundWorkerParsser,然后使用该引用调用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); 
+0

我改变了代码,我送backgroundWorker1到解析器的约束。并在解析器类中调用bgReports.ReportProgress(allreadtchecked/size);并尝试通过private void backgroundWorker1_ProgressChanged捕获此事件,但仍然无法访问私人空间backgroundWorker1_ProgressChanged – MoShe

+0

此答案仍使用第二个BackgroundWorker,bgReports。你真的不应该有两个班级共享一名工作人员,也不应该有另一名工作人员。 –

+0

那么应该如何回答? – MoShe

0

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

backgroundWorker1.DoWork += MyMethod; 


// ...... 


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

此外,为什么你测试你的文本框为null?你是否想要测试它们的文本字符串内容为空?如果是这样,我会使用String.IsNullOrEmpty。

我认为这里的一个更好的设计应该是为你的“Parsser”(请修正拼写并确定这个类是用于Opertional代码的类型/目的)来定义它的消费者类可以订阅的事件。解析器不应该负责异步运行自己。消费者应该有选择的同步或异步运行的东西。无论哪种情况,都可以定义和订阅自定义进展事件(可选)。

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"); 
    } 

在解析器类。

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

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

传递一个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); 
}