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