2012-01-02 3 views
4

Я хочу запустить BackgroundWorker после завершения другого. Я не уверен, как написать код для этого, так что мне действительно нечего показывать.Запуск BackgroundWorker после другого завершен

Я думал о написании его в RunWorkerCompleted, но это кажется неправильным местом, чтобы поставить логику для запуска другого рабочего.

Где и как это сделать?

В принципе, я хочу использовать одного и того же работника, но делать что-то еще. Как и в шаге 1, он анализирует данные из файлов и на шаге 2, после завершения шага 1, он должен написать анализируемые данные из памяти в базу данных.

+2

Нет смысла запускать другую BGW. Просто сначала выполните код step2 после завершения шага 1. Вы даже можете вызвать его метод DoWork(). –

ответ

1

Если вы используете стороннюю библиотеку для планирования работы, то вы можете зарегистрироваться Quartz.NET и механизм работы слушателя, описанный здесь http://quartznet.sourceforge.net/tutorial/lesson_7.html. Если вы хотите реализовать его самостоятельно, я бы использовал один номер BackgroundWorker, который выполнил бы набор заданий, организованных в цепочку Chain of Responsibility. Здесь вы можете узнать больше об этом шаблоне http://dofactory.com/Patterns/PatternChain.aspx.

4

Вы можете вместо этого использовать класс .NET 4.0 Task, а затем выполнить дополнительную работу с очередью, используя Task.ContinueWith.

+0

К сожалению, у меня на компьютере только .NET-3.5, приложение будет запущено ... –

3

Возможно, лучше всего использовать два разных BackgroundWorker компонентов. Запустите второй в обработчике события RunWorkerCompleted для первого. Это кажется очень разумным способом сделать что-то. Просто не пытайтесь делать это с помощью одного BackgroundWorker.

В качестве Tudor mentioned вы можете использовать Task, но тогда вы потеряете удобство BackgroundWorker, со знакомым ориентированным на события интерфейсом, отчет о ходе работы и т. Д.

3

Из вашего описания кажется, что этапы связаны и последовательны, поэтому я буду реализовывать его как единый BGW, где DoWork выполняет оба шага с вызовом ReportProgress между шагом синтаксического анализа и шагом записи на базу данных.

Затем вы можете обработать событие ProgressChanged, выполняющееся в потоке пользовательского интерфейса, для выполнения любой логики после завершения этапа синтаксического анализа, зная, что рабочий уже записывает в базу данных.

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

+0

ReportProgress не только принимает целое число. Перегрузка, которая принимает объект, играет важную роль в предоставлении богатой обратной связи. –

+0

Вы правы, я проверил MSDN и полностью пропустил перегрузку. Ответ обновлен. –

Смежные вопросы