2014-02-04 2 views
1

Как запустить другой backgroundWorker, если основной фоном работает в одном методе?как запустить другую BackgroundWorker, если сначала BackgroundWorker Завершить одним способом

private void button1_Click(object sender, EventArgs e) 
{ 
    CopyWorker.RunWorkerAsync(); 
    EnkripsiWorker.RunWorkerAsync(); 
    CompressWorker.RunWorkerAsync(); 
} 

Я хочу попробовать запустить одним кликом, но только первый работает BackgroundWorker. Итак, как запустить все BackgroundWorker. можно ли это сделать?

как этот

private void button1_Click(object sender, EventArgs e) 
{ 
    CopyWorker.RunWorkerAsync(); 
    if (CopyWorker.RunWorkerCompleted == true) 
    { 
     EncryptWorker.RunWorkerAsync(); 
    } 
    if (EnkripsiWorker.RunWorkerCompleted == true) 
    { 
      CompressWorker.RunWorkerAsync(); 
    } 
} 

Я установил его, и код правильный [EDIT]

CopyWorker.RunWorkerAsync(); 
CopyWorker.RunWorkerCompleted += (s, a) => EnkripsiWorker.RunWorkerAsync(); 
EnkripsiWorker.RunWorkerCompleted += (s, a) => Compress.RunWorkerAsync(); 
+0

Не имеет смысла писать такой код. Просто CopyWorker * также * выполняет работу Encryptworker. И EnkripsiWorker на работу CompressWorker. Хотя при запуске CompressWorker очень мало смысла. Взгляните на класс Task, у вас будет больше шансов, чтобы это правильно. –

+0

Я отредактировал ваш заголовок. Пожалуйста, смотрите: «Если вопросы включают« теги »в их названиях?] (Http://meta.stackexchange.com/questions/19190/), где консенсус« нет, они не должны ». –

+0

Спасибо @John :) – sloqye

ответ

1

Start каждый последующий BackgroundWorker в RunWorkerCompleted случае предыдущий BackgroundWorker «s.

private void CopyWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error == null) // no error occurred 
     EnkripsiWorker.RunWorkerAsync(); 
} 

private void EnkripsiWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Error == null) 
     CompressWorker.RunWorkerAsync(); 
} 

Кроме того, если e.Error не null, то DoWork событие бросил исключение, и вы можете справиться с этим, соответственно (зарегистрировать ее, отобразить сообщение, что угодно).


Если вы хотите быть действительно многословным, и ничего не делать в случае RunWorkerCompleted (! Включая проверку ошибок), вы могли бы сократить его:

CopyWorker.RunWorkerCompleted += (s, a) => EnkripsiWorker.RunWorkerAsync(); 
EnkripsiWorker.RunWorkerCompleted += (s, a) => CompressWorker.RunWorkerAsync(); 
CopyWorker.RunWorkerAsync(); 

Хотя бы мало смысла делая это, поскольку вы могли бы просто объединить три потока. По крайней мере, в первом примере есть шанс сделать другие вещи в событии RunWorkerCompleted до начала следующего потока.

+0

Я сделал это. Я хочу, если я могу сделать это одним щелчком мыши, если в button1_click не писать код в любом «RunWorkerCompleted», может ли это быть сделано? – sloqye

+0

Вы должны были опубликовать код, который у вас был до сих пор. Ваш первый пример просто запускает все три потока одновременно, поэтому вы не будете делать то, что хотите. Второй пример проверяет, что 'CopyWorker' будет завершен сразу после его запуска, поэтому это будет' false', а два других потока не будут запускаться. То, как вы говорите, что вы это сделали (и то, как я выше), является правильным способом. –

+0

Вы правы, я изменил ваш код. Благодарю. Я добавил, что если («.IsBusy») каждый прогон RunWorkerComplete, я исправлю его в своем сообщении. – sloqye

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