2015-12-25 3 views
0

Итак, у меня есть 2 фоновых работника в приложении Winform, просто назовите их b1 и b2. Вот мой код:Остановить backgroundworker от другого фонового работника C#

private void b1_DoWork(object sender, DoWorkEventArgs e) 
{ 
    b2.RunWorkerAsync(); 
    Thread.Sleep(3000); 
    b2.CancelAsync(); 
} 



private void b2_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Global.GetPdfThumbnail(Global.inPDF, Global.outImage); 
} 

Что я действительно хочу запустить b2 нить и сделать b1 нить сна в течение 3 секунд, а затем остановить b2 нить.

Проблема в том, что после b2.CancelAsync(); инструкции b2 isBusy по-прежнему верны.

Пожалуйста, помогите!

извините за мой английский!

+0

Это все асинхронной так это занимает некоторое время для системы, чтобы остановить поток. Это объясняет, почему IsBusy верно сразу после CancelAsync. Вы можете подождать, пока IsBusy станет правдой, но не ясно, чего вы пытаетесь достичь. Кажется бессмысленным начать задание, пусть оно запустится в течение 3 секунд и отбросить то, что было сделано. Просьба уточнить вашу основную цель. –

ответ

0

Put, что к концу вашего мероприятия b2 DoWork:

while (b2.IsBusy) 
{ 
    if (b2.CancellationPending) 
    { 
     e.Cancel = true; 
     break; 
    } 
} 
+0

Возможно, я не понимаю этого, но я пробовал, и этот цикл работает вечно, потому что b1.IsBusy всегда правдивый! :( – tuankhoa1996

+0

Не работает. Программа не может достичь этого цикла, потому что она была удержана в команде GetPdfThumbnail. Эта инструкция требует много времени для обработки, поэтому я должен ее остановить :( – tuankhoa1996

+0

Посмотрите на [этот пример] (http://stackoverflow.com/ questions/800767/how-to-kill-background-worker-all), затем попробуйте вызвать метод отмены и удаления вместо CancelAsync. –

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