Как использовать BackGroundWorker в файле класса? - PullRequest
4 голосов
/ 12 июля 2011

Мой program.cs вызывает родительский mdi frmMain. Затем frmMain открывает различные дочерние формы в зависимости от действий пользователя.

Вся логика обработки написана в BusinessLogic.cs. frmMain при загрузке вызывает методы BusinessLogic.cs для первоначального заполнения данных. Дочерние формы тоже вызывают BusinessLogic, чтобы получать данные и обрабатывать их. Я хотел бы сделать все это с помощью BackGroundWorker, т.е. frmMain вызывает (скажем) метод StartBGWorker () BusinessLogic.cs, и этот метод создает фонового работника для этого конкретного вызова, вызывает событие Do_work, выполняет выборку и обработку и закрывает когда закончите.

Я в растерянности относительно того, как создать экземпляр и события для фонового работника. Так как же мне использовать backgroundworker в файле класса?

Редактировать: Возможно, моя логика неверна, и я должен добавить BGW к каждой форме, которая вызывает BusinessLogig.cs. Тогда всякий раз, когда я вызываю метод BusinessLogic, я могу сделать это через фонового работника. Это будет лучшая реализация?

Edit2: чувствую себя немного идиотским из-за моих сомнений теперь, когда я нашел способ. Я только что создал публичный статический метод с кодом инициализации BGW в BusinessLogic. Теперь, когда мне нужно выполнить обработку, я сначала вызываю этот метод из моих форм. Я хотел бы знать, является ли моя реализация BGW стандартной или есть какой-то способ улучшить дизайн.

Ответы [ 3 ]

3 голосов
/ 12 июля 2011

Включите:

using System.ComponentModel;

Определите его в своем классе:

private BackgroundWorker BackgroundWorker = new BackgroundWorker();

Инициализируйте его:

BackgroundWorker.WorkerSupportsCancellation = false;
BackgroundWorker.WorkerReportsProgress = true;
BackgroundWorker.DoWork += BackgroundWorker_DoWork;
BackgroundWorker.ProgressChanged += BackgroundWorker_ProgressChanged;
BackgroundWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler( BackgroundWorker_RunWorkerCompleted );

Для запуска:

BackgroundWorker.RunWorkerAsync();

Использование точно такое же, как вы знаете из Windows Forms.

1 голос
/ 12 июля 2011

Вы должны взглянуть на библиотеку параллельных задач. Там вы можете запускать, связывать и синхронизировать асинхронные операции.

http://msdn.microsoft.com/en-us/library/dd537609.aspx

Вы также можете внедрить объект с делегатом, событием, Actio, которые могут быть вызваны из новой задачи, чтобы сообщить о прогрессе

например

Вы реализуете сущность, подобную этой

  public class TaskData
    {
        private Action<int> Callback { get; private set; }

        public TaskData(Action<int> callbackAction)
        {
            this.Callback = callbackAction;

        }

        public void TriggerCallBack(int percentageComplete)
        {
            Action<int> handler = Callback;

            if (handler != null)
            {
                handler(percentageComplete);
            }
        }
    }

Чем вы создаете задачу с этим объектом в качестве параметра

TaskData data = new TaskData((percentage)=> Console.WriteLine(percentage + "% completed"));

            Task myTask = new Task(new Action<object>((para)=>
            {
                ((TaskData)para).TriggerCallBack(4);
            }

            ),data);

            myTask.Start();

            Console.ReadLine();

PS: код просто быстрый и грязный взлом. не стесняйтесь улучшить это: -)

0 голосов
/ 12 июля 2011

Пожалуйста, не используйте System.ComponentModel.BackgroundWorker, создайте свои собственные потоки и внедрите события, если вы хотите сообщить о прогрессе.У меня было так много ошибок с этим, что я могу свободно сказать, что это никогда не должно использоваться.

...