다시 Thread.Abort
함수의 안전성에 대해 이야기하고 싶습니다. 나는 정말로 제어 할 수없고 실제로 원하지 않는 작업을 중단하는 방법을 갖고 싶었지만, 가능한 한 빨리 스레드를 제거하여 스레드가 내 응용 프로그램의 목이 마르지 않도록하고 싶습니다..NET Thread.Abort again
그래서 어떤 테스트 코드를 작성하여 Thread.Abort
을 사용할 수 있는지보고 중단 스레드가 자원을 효율적으로 정리하도록하십시오. 일부 스레드가 마지막으로 중단되었다 아마 아무 중단 완료 또는 때문에,이 코드는 약 5 분 동안 일했으며, threadRunCount
이 threadFinally
항상 동일이었다 threadAbort
이 수의 다소 낮았다 지금까지
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++;
}
그래서 : 여기에 코드입니다 .
문제는 무엇인가 놓치겠습니까?
파일 열기를 언급 한 코드를 실행하려고했는데 새 스레드가 생성 된 후 어느 시점에서 예 파일은 여전히 중단되어야하는 다른 스레드와 함께 계속 사용되고 있지만 스레드가 공유 리소스를 사용하지 않으면 어떻게됩니까? 스레드 중단이 다소 안전하지 않다는 것을 증명하는 것 같습니다. 일부 응용 프로그램을 종료해야 할 수도 있지만 일부 관리되지 않는 코드가 실행 중이면 프로세스 중단을 초래하거나 메모리 누수가 발생할 수 있습니까? 제 경우에는 프로세스 실행 시간을 정확한 제한 시간 한도로 제한 할 수있는 것이 필요했고 제 경우에는이 프로세스 실행을 제어 할 수 없었습니다. 이 사건에 대한 아이디어가 있습니까? – hoodoos
SO에 대해 다른 질문을하고, 실행 시간을 제한하는 방법, 그리고 그 코드에서 수행하려는 것을 게시해야합니다. 경우에 따라 코드가 비 관리 코드에서 사용 중이면 원하는 것을 수행 할 수 없습니다 (예 : 이를 수행하는 유일한 "안전한"방법은 제한 시간 경과 후 완전히 종료되는 하위 프로세스를 생성하는 것입니다. –
작은 수정 (비록이 대답이 1 년이 넘었음에도 불구하고) 스레드는 catch와 finally 블록 내에서 취소 할 수 없습니다. 따라서 잘 작성된 finally 블록을 사용하거나 블록을 사용한다고 가정하면 위 예제는 실제로 문제가되지 않습니다. – Steve