2010-05-24 3 views
6

스레드 함수 안에 또 다른 기능 func2를 호출 func1 ...C# Threads.Abort()


가 그럼 난 thread.Abort라는()를 실행하는 경우

func1 만 그만
또는 func1func2이고 모든 기능 func1은 ??

감사

편집

가 : 여기에 자세한 내용은 다음과 같습니다

func1 새 스레드에서 호출, 그것은 지속적으로
func2는 경우에만 일부 몇 가지 일을 시작 ... 정기적으로 func2를 호출 배열이 null이 아닙니다. 끝내고 리턴합니다.

관리자가 데이터를 저장하려고하면 func1의 스레드를 중단하고 배열을 null로 만들고 데이터를 저장 한 다음 t를 채 웁니다. 스레드가 중단됩니다 내에서 그는 새와 배열 .. 다시 func1로 스레드를 시작합니다 ..

가끔 예외가 너무 FUNC1 중단이 FUNC2

+0

테스트 프로그램을 작성하고 시험해 보았을 때, 무슨 일이 일어 났습니까? ;) – Juliet

+1

놀랍게도 가끔 func2가 멈추지 않는다는 것을 알게되었습니다 !! – Betamoo

+0

테스트 프로그램은 여기에 게시하여 실행할 수 있도록 충분히 간단합니까? 그렇지 않다면 목격하는 동작을 보여주는 간단한 코드로 간단하게 만들 수 있습니까? –

답변

14

Thread.Abort은 스레드를 중지 할 수 없으므로 가능하면 사용하지 않는 것이 좋습니다.

이 메서드를 호출하면 보통이 스레드를 종료합니다.

강조 광산.

대상 스레드에서 ThreadAbortException이 발생합니다. 이 예외를 잡으면 코드는 catch 블록의 끝에 도달 할 때까지 계속 실행됩니다. 예외가 발생하면 예외가 자동으로 다시 throw됩니다. catch하지 않으면 일반적인 예외와 유사합니다. 호출 스택을 전파합니다.

예외를 catch하지 않는다고 가정하면 해당 스레드에서 실행중인 모든 코드가 실행을 중지합니다. 해당 스레드에서 시작된 다른 스레드는 영향을받지 않습니다.

+4

제쳐두고 스레드 실행 수명을 제어하는 ​​수단으로'Thread.Abort()'를 사용하는 것은 일반적으로 좋지 않습니다. 하나는 항상 중단 조건에 민감한 스레드 코드를 작성하고 '중단'을 호출하지 않고 정상적으로 종료해야합니다. – LBushkin

3

아무것도 영향을 미치지 않았다 .. 배열이 func2의 null 때문에 발생 시작 .

0

ThreadAbortException이 func1 스레드에 도달하기 전에 func2가 널 배열을 확인한 후에 주 루틴이 배열을 널 (NULL)로 처리하는 경쟁 조건에 직면 할 수 있습니다.

최소한 기본 코드와 func2는 배열 주위에 잠금 장치를 사용해야합니다. 또한 func1 스레드가 다시 시작하기 전에 죽었는지 테스트해야합니다. 그리고 다른 모든 사람들이 말했듯이 Thread.Abort에 의존하기보다 스레드를 멈추라는 신호를 보냅니다.

설명 func2가 func1 스레드 내에서 호출되지만 func1이 func1 내에서 시작된 다른 스레드에서 실행되면 func1 스레드를 종료해도 func2에 영향을주지 않습니다. 스레드는 부모 프로세스의 자식으로 존재하며 시작된 스레드가 아닙니다.

0

누가 알아야 할 사항 :
더 많은 답변 디버깅 나는 시작하기 전에 스레드가 한 번 더 초기화되었음을 알았습니다. ...

Thread T 
    T=new Thread(func1); 
    // Some code... 
    // Start: 
    T=new Thread(func1); 

배경에서이 참조되지 않은 하나의 중단()에 영향을받지 않습니다 ... 그래서이 작업을 계속할 것입니다, 그것이 null 배열을 사용하려고 ... 백그라운드에서 실행 스레드를 일으키는

끝에

:
중단() 참조되지 않은 (명백하게) 된 후

감사 스레드를 종료하지 않습니다 (의 다른 대답 위에서 언급 한) 일부 조건에서 제외 스레드,
중단을() 종료됩니다! !

+1

ThreadAbortException을 어색한 장소에 주입 할 수 있으므로 잠금을 해제하지 못하거나 Dispose (리소스 할당 후 및 try-finally를 입력하기 전에 예외 주입)와 같은 불쾌한 조건이 발생할 수 있습니다. 차단할 수있는 스레드의 제어 된 스레드 종료에 대한 더 나은 솔루션은 Thread.Interrupt()입니다. –