Можно ли запускать фоновые рабочие последовательно? - PullRequest
1 голос
/ 27 марта 2019

Я хочу использовать 3 фоновых рабочих в последовательном порядке.

Сначала нужно выполнить задание, обновить пользовательский интерфейс и запустить второй фоновый рабочий, который сделает то же самое, а затем запустит последнего.Это должно повторяться только при повторном нажатии кнопки.Возможно ли получить такое поведение?

public Form1()
{
     InitializeComponent();
     Bw1= = new BackgroundWorker();
     Bw2= = new BackgroundWorker();
     Bw3= = new BackgroundWorker();
     Bw1.DoWork += new DoWorkEventHandler(Bw1_DoWork);
     Bw1.ProgressChanged += new ProgressChangedEventHandler
                    (Bw1_ProgressChanged);
     Bw1.RunWorkerCompleted += new RunWorkerCompletedEventHandler
                    (Bw1_RunWorkerCompleted);
     Bw1.WorkerReportsProgress = true;
     Bw1.WorkerSupportsCancellation = true;
            ...
     Bw3.DoWork += new DoWorkEventHandler(Bw3_DoWork);
     Bw3.ProgressChanged += new ProgressChangedEventHandler
                    (Bw3_ProgressChanged);
     Bw3.RunWorkerCompleted += new RunWorkerCompletedEventHandler
                    (Bw3_RunWorkerCompleted);
     Bw3.WorkerReportsProgress = true;
     Bw3.WorkerSupportsCancellation = true;

}

private void btnStartAsyncOperation_Click(object sender, EventArgs e)
{

     btnStartAsyncOperation.Enabled = false;
     btnCancel.Enabled = true;
     // Kickoff the worker thread to begin its DoWork function.
     BW1.RunWorkerAsync();
}

//THE DO WORK PART
//UPDATE UI
//tHEN

void BW1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    STOP BW1;
    BW2.RUN();
}
        ...
    //Until BW 3 completes and here this should stop until next click

1 Ответ

1 голос
/ 27 марта 2019

Причина фонового работника не ясна.

Тем не менее, вы можете сделать следующее (при условии, что нет законных async операций ввода-вывода , и эти задачи не нужно запускать из Резьба пула ).

Примечание : если бы была допустимая async работа ввода-вывода, вам не нужно было бы переносить / выгружать в Task и просто использовать await)

Преимущества:

  • Его последовательный
  • Его факторы проще (меньше степеней свободы)
  • Его легче читать
  • Он использует Асинхронный шаблон ожидания (и освобождает насос сообщений / Поток пользовательского интерфейса )
  • И будет хорошо работать с обновлениями пользовательского интерфейса

Пример

private async void btnStartAsyncOperation_Click(object sender, EventArgs e)
{

   try
   {

      await Task.Run(() => FirstTask1());

      // update the ui

      await Task.Run(() => FirstTask2());

      // update the ui

      await Task.Run(() => FirstTask3());

      // update the ui

   }
   catch (Exception exception)
   {
       // make sure you catch or do something with exception
   }
}

Примечание : поскольку это event и async void подходит, вам необходимо убедиться, что вы справляетесь со своими исключениями (поскольку это не наблюдается).Вы также можете защитить себя от двойного щелчка

...