Мой коллега использует стороннюю библиотеку .NET, для которой у нас нет исходного кода. Мы используем ThreadPool для вызова большого количества потоков в эту библиотеку, и иногда один из потоков будет зависать вечно, в то время как остальные весело веселятся.
Итак, мы хотим использовать страшные Thread.Abort
, чтобы убить такие потоки. Я делал это раньше, когда раскручивал свои собственные потоки, но я никогда не использовал ThreadPool. Если мы проследим время начала каждой задачи следующим образом:
static Dictionary<Thread, DateTime> started = new Dictionary<Thread, DateTime>();
static void DoSomeWork(object foo)
{
lock(started)
started[Thread.CurrentThread] = DateTime.Now;
SomeBuggyLibraryThatMightInfiniteLoopOrSomething.callSomeFunction(doo);
lock(started)
started.Remove(Thread.CurrentThread);
}
тогда можем ли мы заблокировать и перебрать запущенные потоки и вызвать Thread.Abort
, чтобы убить их? И если мы это сделаем, то нам нужно будет добавить новый поток в ThreadPool, чтобы заменить тот, который мы только что убили, или будет обрабатывать это ThreadPool для нас?
РЕДАКТИРОВАТЬ: Я хорошо осведомлен обо всех потенциальных проблемах с Thread.Abort
. Я знаю, что в идеале он никогда не должен использоваться в производственном коде, и что он не обязательно даже останавливает поток, и что если вы прерываете поток, когда поток получил блокировку, вы можете повесить другие потоки и т. Д. Но сейчас у нас сжатые сроки и у нас есть веские основания полагать, что в этом конкретном случае мы можем вызвать Thread.Abort
, не подвергая риску весь процесс, и мы хотели бы избежать переписывания этой программы, чтобы устранить ThreadPool, если мы не должны.
Итак, я хочу знать следующее: учитывая, что мы будем вызывать Thread.Abort
в потоке, принадлежащем ThreadPool, существуют ли какие-либо особые проблемы, вызванные тем, что они являются потоками ThreadPool, и нужно ли нам вручную раскручивать новый поток, чтобы заменить тот, который был убит, или ThreadPool сделает это для нас?