2011-09-26 2 views
1

У меня есть приложение для создания окон, которое запускает метод класса BackgroundWorker.Как связать событие изменения прогресса с индикатором прогресса

Я хотел бы добавить окна, отображающие индикатор выполнения, чтобы показать прогресс.

в методе класса У меня есть цикл Еогеаспа поэтому я хотел бы каждый цикл, чтобы отправить форму событию

с текущим процентом.

это то, что я делаю:

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

    } 


} 

`

и в классе я сделать this-

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

Pass ссылка 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); 
+0

я изменить код, и я отправить backgroundWorker1 в конструктор Parsser. и в классе parsser я вызываю bgReports.ReportProgress (allreadtchecked/size); и попытайтесь поймать это событие частным void backgroundWorker1_ProgressChanged, но тем не менее он никогда не попадает в private void backgroundWorker1_ProgressChanged – MoShe

+0

Этот ответ по-прежнему использует второй BackgroundWorker, bgReports.У вас ДЕЙСТВИТЕЛЬНО не должно быть 2 класса, совместно работающих с работником, и у вас нет второго рабочего. –

+0

так что должно быть ответом? – MoShe

0

Вам необходимо настроить фонового рабочего на работу с помощью DoWorkEventHandler. Кроме того, похоже, что каждая половина вашего частичного класса использует свой собственный BackgroundWorker. Вам нужно использовать ту же ссылку. У вас есть bgreports и backgroundWorker1.

backgroundWorker1.DoWork += MyMethod; 


// ...... 


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

Кроме того, почему вы проверяете свои текстовые поля на нуль? Вы пытаетесь проверить содержимое своей текстовой строки на null? если это так, я бы использовал String.IsNullOrEmpty.

Я думаю, что лучший дизайн здесь будет для вашего «Parsser» (пожалуйста, исправьте орфографию и определите, какой тип/цель этот класс для Operentional code), чтобы определить его собственные события, на которые будет подписаться ваш потребительский класс. Парсер не должен нести ответственность за асинхронный запуск. У потребителя должна быть возможность запускать что-то синхронно или асинхронно. В любом из этих случаев пользовательские события прогрессирования могут быть определены и подписаны (опять же, необязательно).

1

Вы создаете дубликат экземпляра BackgroundWorkder в конструктор класса Parsser. Попробуйте ниже

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; 
      ..... 
     } 
1

Проходят лямбда или метод вашего метода работника:

в форме:

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); 
} 
Смежные вопросы