2009-11-04 2 views
1

Итак, у меня есть один класс, который запускает новый класс в новом фоновом работнике, а фоновый работник передает сообщения о статусе обратно с помощью раздела progresschanged.Фоновый рабочий класс и передача сообщений с использованием событий прогресса из другого класса в C#

Когда я попробовать и использовать это, набрав

classname.Dataworker.reportprogress(5) 

из отдельного класса я получаю сообщение об ошибке, что я использую объект до определения.

Примеры, которые я нашел, используют один класс и различные функции.

Это может быть глупая легкая ошибка, но я просто не вижу ее, спасибо за любую помощь, которую вы можете дать!

Общий обзор моего кода:

//form class 

public static BackgroundWorker bw = new BackgroundWorker(); 

onbuttonclick 
{ 
     installer install = new installer(); 
     bw.WorkerReportsProgress = true; 
     bw.WorkerSupportsCancellation = true; 
     bw.DoWork += class2.aFunction; 
     bw.ProgressChanged += new ProgressChangedEventHandler(mainForm_InstallerEvent); 
     bw.RunWorkerAsync(); 
} 

private void mainForm_InstallerEvent(object sender, ProgressChangedEventArgs e) 
{ 

     lbl.Text = e.UserState.ToString(); 
} 

//// class2 класс фон работник

aFunction 
{ 
     InstallerForm.bw.ReportProgress(5); //errors on this! 
} 

ответ

1

Спасибо за помощь, между этими ответами и одним, который я нашел, мне удалось заставить его работать, строка, которую мне не хватало: BackgroundWorker worker = (BackgroundWorker) отправитель;

и затем ссылаться на этот объект работник с worker.reportprogress (..)

Руководство я нашел полезным является: http://www.nerdparadise.com/tech/coding/csharp/backgroundworker/

совершенным, спасибо, ребята :)

0

ReportProgress используется на фоне рабочего потока передать значение в процентах к Продвинутый_Changed делегат (ы). В этом article показаны примеры как синхронных, так и асинхронных.

6

Вам нужно будет позвонить ReportProgress с UserState, если вы хотите сделать что-то вроде этого:

lbl.Text = e.UserState.ToString(); 

Тогда ваш вызов будет выглядеть примерно так:

aFunction 
{ 
     InstallerForm.bw.ReportProgress(5, "5% Complete"); 
} 

Прямо сейчас это выглядит ваш e.UserState будет пустым, а вызов ToString() приведет к исключению нулевой ссылки.
Here является примером, где UserState является текстом.

0

Это был мой ленивый обходной путь (потому что я не хотел использовать дополнительный обработчик событий). В то время я тоже не хотел понимать userstate;) Поэтому я использовал список со всеми предупреждениями/сообщениями для определенной длительной операции. Строки сообщений были сохранены в App.Properties.Settings, мощном репозитории ресурсов в приложении. Поскольку ReportProgress берет целое число, я отправляю индекс списка в пределах ReportProgress по Progress_Changed.

пример: Следующий метод был вызван в do_work.

private void LongOperation() 
{ 
     try 
     { 
      //the operation 
      if (success){ 
      //write a message to a status label 
      bgWorker.ReportProgress(1); 
      } 
      else{ 
      //write a message to a status label 
      bgWorker.ReportProgress(2); 
      }    
     } 
     catch(){...} 
    } 

    public void bgWorker_ProgressChanged(object sender, ProgressChangedEventArgs p) 
    { 
     int lstIndex = p.ProgressPercentage; 
     lblStatus.Text = mssglist[lstIndex].ToString(); 
    }