2011-03-13 2 views
0

멀티 스레드 wcf maxConcurrentCalls = 10을 사용하고 있습니다. 내 서비스에 대한 호출을 기록하여 10 개의 다른 스레드가 내 서비스 클래스에서 실행 중이며 다음 호출에서 재사용된다는 것을 알 수 있습니다.wcf 스레드를 파기하십시오

스레드를 삭제/삭제하도록 WCF에 지시하여 다음 호출시 새 스레드를 만들 수 있습니까?

나는 때때로 (예기치 않은 예외가 발생하면) 제거하려고하는 스레드 정적 상태이기 때문입니다. 성능을 얻으려면 스레드 정적 범위를 사용하고 있습니다.

+4

스레드를 수동으로 제어하지 않는 시나리오에서 ThreadStatic을 사용하면 디자인이 좋지 않습니다. –

답변

1

WCF는 새 스레드를 만들지 않습니다. 스레드 풀의 스레드를 사용하여 요청을 처리합니다. 따라서 요청이 시작되면 요청을 실행하기 위해이 풀에서 스레드를 끌어오고 완료된 후에는 풀에 스레드를 반환합니다. WCF가 밑에 쓰레드를 사용하는 방법은 여러분이 의지해서는 안되는 구현 세부 사항입니다. 상태를 저장하기 위해 ASP.NET/WCF에서 Thread Static을 절대로 사용하지 않아야합니다.

ASP.NET에서 전체 요청을 통해 사용할 수있는 상태를 저장하려면 HttpContext.Items 및 WCF OperationContext을 사용해야합니다.

다음은 good blog post입니다.이를 추상화하는 데 좋은 방법을 보여줄 수 있습니다.

+0

이것은 asp.net 시나리오가 아닙니다 – Stig

+1

@Stig, 예, WCF 시나리오입니다. 비슷한 규칙 : 스레드를 제어 할 수없는 시나리오에서는 스레드 정적을 사용하지 마십시오. 제가 제안한대로 OperationContext를 사용하십시오. –

+0

실제로 스레드 정적 범위에서 인스턴스를 제공하기 위해 Structuremap을 사용하고 있습니다. – Stig

관련 문제