Мой коллега использует стороннюю библиотеку .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 сделает это для нас?