ThreadPool.QueueUserWorkItem으로 생성 된 스레드를 중단하는 방법

StackOverflow https://stackoverflow.com/questions/26816

  •  09-06-2019
  •  | 
  •  

문제

QueueUserWorkItem으로 생성 된 스레드를 중단하는 방법이 있습니까?

아니면 그럴 필요가 없나요?메인 애플리케이션이 종료되면 어떻게 되나요?생성 된 모든 스레드가 자동으로 중단됩니까?

도움이 되었습니까?

해결책

중단 할 필요가 없습니다.응용 프로그램이 종료되면 .NET은 IsBackground= true 인 모든 스레드를 종료합니다..NET 스레드 풀에는 모든 스레드가 IsBackground= true로 설정되어 있으므로 걱정할 필요가 없습니다.

이제 Thread 클래스를 새로 만들어 스레드를 만드는 경우 스레드를 중단하거나 IsBackground 속성을 true로 설정해야합니다.

다른 팁

<인용구>

그러나 관리되지 않는 해당 스레드의 리소스를 많은 문제가 발생합니다.

그것은 당신이 그것들을 어떻게 사용하고 있 었는가에 달려 있습니다. 관리되지 않는 자원이 적절하게 래핑 되었다면 그것들을 참조한 쓰레드를 죽이는 데 사용 된 메커니즘에 관계없이 그들의 래퍼 마무리에 의해 처리 될 것입니다. 어쨌든 앱이 종료되면 OS에서 관리되지 않는 리소스를 해제합니다.

(Windows) 애플리케이션이 앱 종료시 정리를 시도하는 데 너무 많은 시간을 소비한다는 일반적인 느낌이 있습니다. 종종 다시 삭제할 수 있도록 (또는 페이징 코드를 페이징하는) 엄청난 양의 메모리를 페이징해야합니다.OS가 처리 할 수있는 관리되지 않은 개체를 해제합니다.

스레드 풀은 백그라운드 스레드를 사용합니다.따라서 응용 프로그램이 종료되면 모두 자동으로 닫힙니다.

스레드를 직접 중단하려면 스레드를 직접 관리하거나 (스레드 객체에서 Thread.Abort ()를 호출 할 수 있습니다) 또는 다음과 같은 알림 메커니즘을 설정해야합니다.스레드에게 스스로 중단해야한다고 알려줄 것입니다.

예, 가능합니다.그러나 이러한 스레드에서 관리되지 않는 리소스를 사용하는 경우 많은 문제가 발생할 수 있습니다.

예, 백그라운드입니다.하지만 여러 번의 다운로드 나 기타 작업을 위해 ThreadPool을 사용하는 애플리케이션이있는 경우 f.ex를 중지하려면 어떻게 중지합니까?내 제안은 다음과 같습니다. 최대한 빨리 스레드 종료, f.ex 라코 디스

stop= true로 설정하면 두 번째 (현재 대기열에있는) 스레드는 대기열 스레드가 처리를 완료 한 후 자동으로 종료됩니다.

Lukas Šalkauskas의 답변에 따르면

하지만 다음을 사용해야합니다. 라코 디스

컴파일러에게이 변수가 여러 스레드에서 사용됨을 알려줍니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top