http 핸들러 인터페이스에서 bool IsReusable의 중요성


답변:


152

핸들러의 일반적인 진입 점은 ProcessRequest 메소드입니다. 그러나 클래스 생성자에 빌드 비용이 많이 드는 일부 인스턴스 값을 구성하는 코드가있을 수 있습니다.

재사용 가능을 true로 지정하면 애플리케이션은 매번 재구성 할 필요없이 ProcessRequest 메소드를 반복해서 호출하여 인스턴스를 캐시하고 다른 요청에서 재사용 할 수 있습니다.

응용 프로그램은 현재로드를 처리하는 데 필요한만큼의 이러한 핸들러를 인스턴스화합니다.

단점은 필요한 인스턴스 수가 현재 존재하는 인스턴스보다 많으면 더 많은 메모리를 사용한다는 것입니다. 반대로 인스턴스 값이 GC주기를 유지하고 자주 다시 할당 할 필요가 없으므로 메모리 사용을 줄일 수도 있습니다.

또 다른 경고는 ProcessRequest 실행이 끝날 때 다른 요청이 객체를 재사용하기를 원하는 상태인지 확인해야한다는 것입니다.


2
IsReusable = True를 지정하여 달성 한 키 최적화로 객체 재사용을 언급했습니다. IsReusable = False로 설정하면 서버가 처리기의 여러 인스턴스를 인스턴스화하지 않습니다. IE-동시 요청을 제거합니까?
Ian

@Ian 나는 재사용 가능이 거짓 일 때 정상적인 페이지로 기능한다고 생각하지만, 틀릴 수도 있습니다. 재사용 가능한 경우 2 개 또는 3 개의 인스턴스로 6 개의 동시 요청을 처리 할 수 ​​있지만 (예제 만 해당) 재사용 할 수없는 경우 1 : 1 인스턴스 / 프로세스가 필요합니다. .Net은 1 명의 작업자 스레드가 상태를 지속적으로 새로 고치거나 다시 초기화하는 동안 모든 작업자가 처리하려고 시도하면서 요청을 쌓을 수 있다고 상상할 수 없습니다.
DavidScherer

47

또한 AnthonyWJones의 대답에, 당신의 HTTP 처리기를 반환하는 경우 true에는 IsReusable다음 완전히 스레드 안전되어 있는지 확인해야합니다.

현재 Microsoft 구현에서는 연속적으로 재사용하는 것처럼 보이지만 재사용 가능한 핸들러를 동시에 재사용 할 수 없음을 나타내는 문서는 없습니다. 그러나 적어도 이론 상으로는 단일 처리기 인스턴스가 여러 요청에 의해 동시에 재사용 될 수 있으므로 다른 동시 스레드에 의해 수정 될 수있는 데이터에 의존해서는 안됩니다.


두껍게해서 미안하지만 누군가“문맥 전환”의 의미에 대해 자세히 설명해 주시겠습니까? sesson 또는 쿼리 문자열 (content.Request.QueryString)에서 사물에 액세스하면 재사용 가능합니까?
zod

5
컨텍스트 전환은 CPU가 한 스레드에서 처리를 중지하고 다른 스레드에서 처리를 시작하는 경우입니다. IE CPU는 한 스레드에서 다른 스레드로 컨텍스트를 전환했습니다. 이것은 PC에서 지속적으로 발생하며 멀티 코어 컴퓨터가 있기 전에 멀티 태스킹의 환상을 제공했습니다.
Larry Dukek

나는 언제 상황 전환이있을 수 있다고 말했는지 이해할 수 없었다 . url을 입력하고 Enter 키를 누르면 한 번에 하나의 요청이 실행됩니다. 권리 ?

여러 사용자가 동시에 응용 프로그램을 사용하는 경우 컨텍스트 전환이 문제가됩니다. 예를 들어, 두 명의 사용자가 동시에 동일한 레코드를 업데이트하려는 경우 컨텍스트 전환으로 인해 문제가 발생할 수 있습니다.
Ishmael Smyrnow

7
IsReusable스레드 안전성 요구 에 대한이 설명은 AnthonyWJones 응답과 모순되는 것 같습니다. 세 번째 단락 (응용 프로그램이 많은 인스턴스를 생성합니다 ...)을 이해하면 재사용 가능한 핸들러 인스턴스는 동시에 재사용되지 않고 현재 처리가 완료된 후에 만 ​​재사용됩니다. 이것이 사실이라면 스레드 안전이 필요하지 않습니다.
Frédéric

3

해당 인스턴스에 상태를 저장하지 않은 경우 (예 : 필드가없는 경우 ( "클래스 변수")) 안전하게 재사용해야합니다.

안전한쪽에있는 것은 기본적으로 false입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.