IHttpHandler.IsReusable의 용도는 무엇입니까?


104

나는 작성 중이며 속성 IHttpHandler을 구현해야 IsReusable합니다. MSDN 설명서를 보면 다음과 같이 말합니다.

다른 요청이 IHttpHandler 인스턴스를 사용할 수 있는지 여부를 나타내는 값을 가져옵니다.

이것은별로 도움이되지 않습니다. 재사용 가능한 핸들러를 사용해야하는 상황과 재사용이 불가능한 상황은 무엇입니까?

후속 질문 :

  1. 재사용이란 무엇입니까?
  2. 상태 (즉, 클래스 변수)를 유지할 수 있습니까 Reusable = true?


"재사용"은 핸들러의 특정 인스턴스로 둘 이상의 요청을 처리하는 것을 의미합니다. Session에 무엇이든 저장할 수 있습니다. 핸들러의 인스턴스가 해제 되어도 영향을받지 않습니다.
IrishChieftain 2011 년

@IrishChieftain .Net이 인스턴스화 된 HttpHandlers의 가방을 유지하고 하나를 선택하고 컨텍스트를 제공하는 것과 같습니다.
Kees C. Bakker 2011 년

1
@IrishChieftain 지금은 일부 로그 정보의 간단한 스 트리머로 사용하고 있습니다. 하지만 IHttpHandlers를 사용하는시기와 방법을 이해하는 데 어떤 의미가 있는지 알아 보려고합니다. 많은 사람들이 잊고있는 기능입니다.
Kees C. Bakker

답변:


93

이 속성은 동일한 IHttpHandler 인스턴스로 여러 요청을 처리 할 수 ​​있는지 여부를 나타냅니다. 기본적으로 요청 파이프 라인의 끝에서 HttpApplication의 handlerRecycleList에 배치 된 모든 http 처리기는 null로 설정됩니다. 핸들러를 재사용 할 수있는 경우 null로 설정되지 않고 인스턴스가 다음 요청에서 재사용됩니다.

가장 큰 이점은 가비지 수집 할 개체가 적기 때문에 성능입니다.
재사용 가능한 핸들러의 가장 중요한 문제점은 스레드로부터 안전해야한다는 것입니다. 이것은 사소한 것이 아니며 약간의 노력이 필요합니다.

가비지 컬렉터가 쉽게 처리해야하므로 관리되는 리소스 만 사용하는 경우 기본값 (재사용 불가능)을 그대로 두는 것이 좋습니다. 재사용 가능한 처리기의 성능 향상은 스레딩 버그를 찾기 어렵게 만드는 위험에 비해 일반적으로 무시할 수 있습니다.

핸들러를 재사용하기로 결정한 경우 핸들러 인스턴스가 동시에 액세스되면 여러 요청이 값을 쓰고 / 읽기 때문에 클래스 변수에서 상태를 유지하지 않아야합니다.


1
클래스 변수에서 상태를 유지하지 않기위한 마지막 권장 사항은 약간 혼란 스럽습니다. IsReusable을 false로 설정했다고 가정하면 해당 HttpHandler의 동일한 인스턴스에 액세스하는 다른 요청 (동시 여부에 관계없이)이 없을 가능성이 없으므로 클래스 변수에서 상태를 유지하는 것이 안전할까요?
Ben Amada

2
확실한. IHttpHandler를 재사용하는 경우에만 적용 가능하다는 것을 강조하는 마지막 권장 사항을 다시 표현했습니다. 설명 해주셔서 감사합니다, 벤!
Branislav Abadjimarinov

7
무엇의 가치를 들면, 나는 많은, 많은 구현 IHttpHandler으로들 IsReusable로 설정 true하고 아무런 문제가 없었습니다. 명심해야 할 주요 사항은 클래스 범위의 변수가 아니라 함수에서 지역 변수를 사용하는 것입니다.
dana 2014

6
훌륭한 설명입니다. 명확하고 요점. MSDN 기사가 이처럼 간결했으면합니다.
AlexVPerl

1
@Branislav-내가 당신의 대답을 올바르게 이해한다면. 다른 스레드가 처리기의 다른 인스턴스를 동시에 사용할 수있을뿐만 아니라 다른 스레드가 처리기의 SAME 인스턴스를 동시에 실행하는 것도 가능합니까?
이안

11

분명히 이것은 핸들러를 메모리에 유지하고 여러 요청을 처리 할 수 ​​있습니다. false로 설정하면 들어오는 각 요청에 대해 처리기의 새 인스턴스를 만들어야합니다.

다음은 제대로 사용하지 않을 때 어떤 일이 발생하는지 보여주는 질문입니다.

HttpHandler를 사용하여 데이터베이스 이미지 스트리밍


답변을 뒷받침하는 문서가 있습니까?
Kees C. Bakker

4
당신처럼 MSDN에서 만족스러운 문서를 찾을 수 없었기 때문에 데이터베이스에서 전자 상거래 사이트의 페이지로 이미지로드를 테스트 한 다음 무슨 일이 일어 났는지 관찰해야했습니다. :)
IrishChieftain

5

요청이 들어올 때마다 처리기를 재활용하는 것보다 처리기를 재활용하는 것이 더 저렴하며 서버는 메모리를 적게 사용하므로 GC가 수행해야하는 작업이 쉬워집니다. 핸들러가 새 요청을 처리하는 데 문제가되지 않는 상태 (즉, 핸들러 인스턴스의 모든 상태가 재설정 됨) 에 있으면 재사용 가능한 것으로 간주되어야합니다.

편집하다

내 대답이 재사용이 무엇인지 올바르게 정의하는지 잘 모르겠습니다. 실제로 동시 재사용을 허용하므로 효과적으로 상태를 피하거나 스레드로부터 안전한 방식으로 신중하게 관리 할 수 ​​있습니다.


저도 그렇게 생각합니다. 맞습니다. 실제 (기본) 질문은 '재사용이란 무엇입니까?'입니다.
Kees C. Bakker 2011 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.