Снова я хочу поговорить о безопасности функции Thread.Abort
. Мне было интересно каким-то образом прервать операции, которые я не могу контролировать, и не хочу на самом деле, но я хочу, чтобы мои потоки были бесплатными как можно скорее, чтобы предотвратить поток, жаждущий моего приложения.. NET Thread.Abort снова
Таким образом, я написал несколько тестовых кодов, чтобы узнать, можно ли использовать Thread.Abort
и отменить прерывание потока. Вот код:
int threadRunCount = 0;
int threadAbortCount = 0;
int threadFinallyCount = 0;
int iterations = 0;
while(true)
{
Thread t = new Thread(() =>
{
threadRunCount++;
try
{
Thread.Sleep(Random.Next(45, 55));
}
catch(ThreadAbortException)
{
threadAbortCount++;
}
finally
{
threadFinallyCount++;
}
});
t.Start();
Thread.Sleep(45);
t.Abort();
iterations++;
}
Так, до сих пор этот код работал в течение примерно 5 минут, и threadRunCount
всегда было равен threadFinally
и threadAbort
был несколько ниже, в количестве, потому что некоторые нити выполнены без прерывания или, возможно, были прерваны в конце концов ,
Итак, вопрос в том, что-то пропустить?
Я попытался запустить код, который вы упомянули, с открытием файла, и да в какой-то момент после создания нового потока файл по-прежнему занят другим потоком, который должен быть прерван на самом деле, но что, если потоки не будут использовать общие ресурсы? Кажется, это просто доказывает, что нить Abort несколько небезопасна. Даже если мне просто нужно прекратить применение приложения, не удалось прервать процесс зависания или утечки памяти, если был запущен какой-то неуправляемый код? В моем случае мне нужно что-то, что может ограничить время выполнения процесса до предельного предела времени ожидания, и в моем случае я не могу контролировать выполнение этого процесса. Любые идеи по этому делу? – hoodoos
Вы должны задать другой вопрос о SO, как ограничить время выполнения, а затем опубликовать то, что вы намереваетесь сделать в этом коде. В некоторых случаях в качестве примера не удастся выполнить то, что вы хотите, если код занят неуправляемым кодом. Единственным «безопасным» способом сделать это было бы создание подпроцесса, который полностью завершится после истечения таймаута. –
Небольшая коррекция (хотя этот ответ более года) Нитки не прерываются внутри улова и, наконец, блоки. Поэтому, предполагая хорошо написанный блок finally или использование блоков, приведенный выше пример не является проблемой. – Steve