2013-08-05 4 views
2

기본적으로 - 우리는 단위 테스트를 작성합니다. 때때로 이러한 단위 테스트는 스레드를 시작하고 종종 스레드 풀에서 작업을 시작합니다. 백그라운드 스레드에서 문제가 발생하면 미래의 테스트에서 이상한 문제가 발생할 수 있습니다. 우리가 각 테스트의 기본 분해에하고 싶은 것은 기본적으로C# 스레드 풀 및 다른 스레드 검사

  • 스레드가 어떤 실행하는 경우
  • 테스트를 실패 실행중인 검사가 정상을 위해, 지금

안입니다 실마리를 열거하고 나중에 비교할 수 있습니다 - 괜찮습니다. 스레드 풀은 사물을 엉망으로 만듭니다. 왜냐하면 새로운 스레드가 유효하게 만들어 졌기 때문에 아무것도하지 않고 기다리고 있기 때문입니다. 괜찮습니다. 테스트가 실행 중이라면 문제가되지 않습니다. 또한 기억해야 할 것은 테스트 또는 코드 테스트를 작성하지 않고 있습니다. 다른 누구도 시도하지 못하도록하는 기본 라이브러리를 작성하고 있지만 실제로 시도 할 수는 없습니다. 쓰레드 풀이나 그와 비슷한 것, 왜냐하면 나는 누군가가 표준 것을 사용하고 있지 않다는 것을 확신 할 수 없기 때문이다.

누구나 스레드 풀에서 소유하고있는 스레드가 무엇인지 알려주고 유휴 상태인지 여부를 알 수있는 방법이 있습니까? 내 다음 단계는 리플렉션을 사용하여 개인 변수를 크롤링하는 것입니다.하지만 누군가가 더 좋은 방법을 찾고 싶습니다.

덕분에, 대런

+0

ThreadPool.GetAvailableThreads(), GetMaxThreads()와 비교하십시오. 코드가 매달려있는 tp 스레드를 남겨두면 테스트에서 실패해야합니다. 그렇지 않으면 프로덕션에서 제대로 끝나지 않을 것입니다. –

답변

0

난 당신이 스타일의 스레드/작업/작업 항목을 불이 앤 잊지 사용하는 추론. 당신이 그렇지 않다면 당신은 문제가 없을 것입니다.

단위 테스트 (프로덕션에서)를 벗어난 경우에도 오류를 잊지 않기 때문에 화재 및 잊어 버린 패턴이 문제가되는 패턴이라고 생각합니다. 또한 보류중인 모든 HTTP 요청이 처리 된 후 백그라운드 작업이 완료되기 전에 작업자 프로세스가 종료 될 수 있기 때문에 ASP.NET에서 백그라운드 작업이 완료 될 것이라고 보장 할 수 없습니다.

코드를 감사하고 모든 동시성을 새로운 Task 기반 모델로 전환하는 것이 좋습니다. 그렇게하면 완료를 추적 할 수 있습니다. 또한 완료를 기다리고 오류를 전파 할 수 있습니다.

목록에 시작된 작업을 모두 추가 할 수 있습니다 (어쩌면 사용자 정의 TaskScheduler을 사용하거나 어쩌면 수동으로). 단위 테스트가 종료되면 해당 목록의 내용에 Task.WaitAll을 수행합니다. 그것은 당신에게 완성을 보장합니다.

어떤 경우 든 스레드 풀은 대기열에있는 항목이나 수신 대기하지 않을 수 있습니다. 이 문제를 코드에서 해결해야합니다.