2013-06-21 3 views
1

Я работаю над проектами, которые нужно выполнить с помощью потока.C# BackgroundWorker Wait До окончания

У меня есть работник фона, который выполняет эту работу. То, что я хочу сделать, - это когда я нажму Button3, мой фоновый рабочий перезапустится. Я уже пытался подождать, пока фоновый работник закончит с Backgroundworker1.IsBusy, но это никогда не заканчивается. Когда я ударил Button3, я получаю ошибку

Это BackgroundWorker в настоящее время занят и не может запускать несколько задач одновременно

Это мой код:

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void button2_Click(object sender, EventArgs e) 
    { 
     backgroundWorker1.CancelAsync(); 
    } 

    private void button3_Click_1(object sender, EventArgs e) 
    { 
     backgroundWorker1.CancelAsync(); 
     backgroundWorker1.RunWorkerAsync(); 
    } 

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e) 
    { 
     BackgroundWorker worker = sender as BackgroundWorker; 
     int x = 0, y = 0, result; 

     while (true) 
     { 
      if (backgroundWorker1.CancellationPending) 
      { 
       e.Cancel = true; 
       break; 
      } 
      else 
      { 
       x++; 
       y++; 
       result = x + y; 
       this.label1.Invoke(new MethodInvoker(() => this.label1.Text =  result.ToString())); 
      } 
     } 
    } 

}//public partial class Form1 : Form 

ответ

3

Прислушайтесь завершенного события, а затем перезапустить работника там -

private bool restartOnCancel = false; 

private void button3_Click_1(object sender, EventArgs e) 
{ 
    restartOnCancel = true; 
    backgroundWorker1.CancelAsync(); 
} 

private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if ((e.Cancelled == true) && restartOnCancel) 
    { 
     restartOnCancel = false; 
     backgroundWorker1.RunWorkerAsync(); 
    } 
} 
+0

Примечание: вам нужно только перезагрузитьOnCancel, если вы планируете отменять работу без перезапуска задания. Если cancel означает, что вы всегда перезапускаете задание, вы можете просто удалить все файлы restartOnCancel. –

+0

True - я предположил из примера, что, поскольку кнопка1 запускается, кнопка2 отменяет, а кнопка3 перезапускается, что это необходимо - но если они были только для тестирования, и вы действительно просто хотите перезапустить каждый раз, вы можете удалить части restartOnCancel. – Deeko

+1

Спасибо, что сделал трюк. Я просто добавил, если (! BackgroundWorker1.IsBusy) { backgroundWorker1.RunWorkerAsync(); } в button3, чтобы я мог начать работу там. Большое спасибо – oimitro

0

Фоновый работник не завершил работу перед вызовом RunWorkerAsync. Вы можете подключить метод к событию RunWorkerCompleted и вызвать RunWorkerAsync там, если нажата кнопка3.

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