My WinForm вызывает класс, который выполняет некоторые операции копирования. Я хотел бы показать прогресс этого в форме.
Я хотел бы использовать Backgroundworker, но я не знаю, как сообщить о прогрессе от класса к форме (/backgroundworker)
My WinForm вызывает класс, который выполняет некоторые операции копирования. Я хотел бы показать прогресс этого в форме.
Я хотел бы использовать Backgroundworker, но я не знаю, как сообщить о прогрессе от класса к форме (/backgroundworker)
используйте метод OnProgressChanged() BackgroundWorker сообщить о прогрессе и подписаться на ProgessChangedEvent BackgroundWorker, чтобы обновить прогресс в вашем графическом интерфейсе.
Класс копирования знает BackgroundWorker
и подписывается на ProgressChanged
. Он также предоставляет собственное событие ProgressChanged
, которое возникает обработчиком события для фона ProgressChanged
. Наконец, ваш Form
подписывается на событие ProgressChanged
класса копирования и отображает прогресс.
код:
public class CopySomethingAsync
{
private BackgroundWorker _BackgroundWorker;
public event ProgressChangedEventHandler ProgressChanged;
public CopySomethingAsync()
{
// [...] create background worker, subscribe DoWork and RunWorkerCompleted
_BackgroundWorker.ProgressChanged += HandleProgressChanged;
}
private void HandleProgressChanged(object sender, ProgressChangedEventArgs e)
{
if (ProgressChanged != null)
ProgressChanged.Invoke(this, e);
}
}
В вашей форме просто подпишитесь на событие ProgressChanged
CopySomethingAsync
и покажите ход.
Все, что вам нужно знать о BackgroundWorker, находится на msdn.
Как говорится в статье:
Чтобы получать уведомления о прогрессе, обработайте событие ProgressChanged.
Update:
Прочитав дополнительные вопросы Martijn и учитывая, что у него есть класс, который до сих пор выполнял свою работу, по-видимому, в потоке переднего плана, я добавил бы следующее:
Рабочий класс несет ответственность за работу, поэтому он также несет ответственность за отчетность о своем прогрессе. Тот факт, что он создает фоновый поток для выполнения работы, не является проблемой Формы.
Итак, я был бы склонен к тому, чтобы класс устанавливал BGW и обрабатывал события ProgressChanged, а затем поднимал свои собственные события (в потоке переднего плана), к которым сама форма могла бы подписаться. Я использую эту кодировку в тонне WinForms, и она отлично работает.
Альтернативой было бы разоблачить BGW как общедоступное свойство рабочего класса и напрямую обработать его события. Но мне это не так нравится, поскольку он делает форму зависимой от реализации рабочего класса. Это, как правило, плохая вещь.
Это делается с помощью метода экземпляра ReportProgress
вашего текущего объекта BackgroundWorker
. Ваша форма должна подписаться на событие ProgressChanged
.
MSDN имеет здесь небольшой пример: http://msdn.microsoft.com/en-us/library/waw3xexc%28v=VS.100%29.aspx
вызов в вашем классе
backgroundWorker.ReportProgress(i++);
на обработчике формы событие
//declare progressBar1 in the form and set range
// progressBar1.Minimum = 0;
//progressBar1.Maximum = 100;
private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
//show progress bar
}