Запустить новый theard из другого потока и прервать его С#

если я делаю что-то вроде этого:

new Thread(DoWork).Start();

void DoWork(){new Thread(DoMoreWork).Start();}

и я прерываю первый поток, который запускает DoWork, DoMoreWork также будет прерван? если нет, как я могу прервать секущий поток (DoMoreWork)?

Спасибо!

Обновлять:

Проблема в том, что я запускаю скрипт с Microsoft.Scripting и для этого запускаю новый поток, который вызывает метод Execute() из Microsot.Scripting, и я хочу иметь возможность прервать скрипт. Я могу прервать свой поток, но я не знаю, какой поток Execute создать для запуска сценария.


person Maya    schedule 18.03.2012    source источник


Ответы (2)


  1. Прерывание «родительского» потока не остановит «дочерний».

  2. Использование Thread.Abort — плохая идея. вы должны спроектировать свой поток так, чтобы он завершался изящно: см., например, ответы на этот вопрос.

Если вы спроектируете свои потоки так, чтобы они завершались изящно (например, когда вы сигнализируете о событии), это также позволит вам убить оба потока.

person OSH    schedule 18.03.2012
comment
@maya у вас есть возможность использовать задачи (msdn .microsoft.com/en-us/library/) вместо этого? Задачи позволят вам создавать дочерние задачи, которые умирают, когда умирает родитель (а также поддерживает токен отмены, который в значительной степени делает все, что вам нужно) - person OSH; 18.03.2012
comment
Задача будет идеальной, но я не могу изменить ее на задачу :-( - person Maya; 18.03.2012
comment
значит, у вас нет кода, создавшего внутреннюю задачу? Я искал способ перечислить все потоки процесса (так что вы перечисляете перед запуском скрипта и надеетесь, что все новые дополнения пришли из скрипта - очень плохой хак, но может сработать). Не мог найти способ сделать это. Я не могу найти способ сделать то, что вы хотите, если у вас нет контроля над внутренним кодом (кодом скрипта). - person OSH; 18.03.2012

это плохой дизайн...

вы не должны этого делать, потому что, если второй поток зависнет, первый не закроется, и ваш GC не будет очищать ресурсы AKA deadlock

потоки предназначены для параллельного выполнения и синхронизации, а не в иерархии.

там вы можете найти хорошее руководство по потоковой передаче .net: http://www.albahari.com/threading/

person giammin    schedule 18.03.2012
comment
это не мой дизайн, и я должен использовать его как есть ... в любом случае проблема в том, что я запускаю скрипт с помощью Microsoft.Scripting, и для этого я запускаю новый поток, который вызывает Execute(), и я хочу иметь возможность прервать скрипт - person Maya; 18.03.2012