Что ж, OO-ответ будет содержать список потоков в виде поля.
private readonly List<Thread> threads = new List<Thread>();
И затем добавить вновь созданный поток в список в первом обработчике.
var thread = new Thread(myfunc);
thread.Start();
threads.Add(thread);
Тогда вы можете перебирать каждый поток во втором обработчике, прерывая каждый из них по очереди.
foreach(var thread in threads)
thread.Abort();
Но я думаю, что наиболее важным моментом здесь является то, что почти никогда веская причина для вызова Thread.Abort
.
со страницы MSDN :
Когда поток сам вызывает Abort, эффект аналогиченвыбрасывание исключения;ThreadAbortException происходит немедленно, и результат является предсказуемым.Однако, если один поток вызывает Abort в другом потоке, прерывание прерывает любой выполняемый код. Существует также вероятность того, что статический конструктор может быть прерван. В редких случаях это может привести к предотвращает создание экземпляров этого класса в этом домене приложения. В .NET Framework версий 1.0 и 1.1 существует вероятность, что поток может прерваться во время работы блока finally, в этом случае блок finally прерван.
Поток, вызывающий Abort, может заблокироваться, если прерываемый поток находится в защищенной области кода, такой как блок перехвата, блок finally или область ограниченного выполнения.,Если поток, вызывающий Abort, удерживает блокировку, необходимую для прерванного потока, может произойти тупик.
Было бы намного лучше использовать некоторую форму сигнализации, например, настройкуManualResetEvent
, что каждый поток будет опрашивать с периодической периодичностью.В качестве альтернативы вы могли бы использовать класс BackgroundWorker
, который имеет некоторую поддержку отмены задач (вызовите CancelAsync
для него и попросите рабочие потоки периодически проверять CancellationPending
).Если вы используете .NET 4.0, вы также можете использовать TPL .