2010-01-28 4 views

답변

1

스프링이 즉시 마음에 들게하는 방법은 참조 카운트가 0이 될 때 리소스를 처리 할 수 ​​있도록 참조 계산 "래퍼"의 형태로 리소스를 래핑하는 것입니다. 이 같은

뭔가 :

public class RefCountingWrapper<T> where T:IDisposable, new() 
{ 
    private int referenceCount = 0; 
    private T resource; 

    public RefCountingWrapper(T item) 
    { 
     resource = item; 
    } 

    public T Acquire() 
    { 
     referenceCount++; 
     return resource; 
    } 

    public void Release() 
    { 
     referenceCount--; 
     if (referenceCount <= 0) 
     { 
      resource.Dispose(); 
     } 
    } 
} 

적용주의 사항 : 획득의 결과를 가져 가서에 대한 참조를 보유하고있다

  • 누구나 지금 배치 된 무언가에 대한 참조를 개최합니다 (즉, 일단 출시하면, 시도해서는 안됩니다!).
  • 이것은 Acquire 's 및 Release 's와 일치하지 않는 사람들에게 취약하기 때문에 다른 사람들이 부주의하게 처분 된 객체를 만날 수 있습니다. 리소스를 사용하는 모든 코드를 제어하거나 Acquire/Release를 호출해도 큰 문제는 아닙니다.
  • Acquire/Release 메소드에 약간의 잠금을 걸기를 원할 것입니다.
  • 은 기본 자원에 .Dispose()를 호출로부터 획득 자원을 사용하고 코드를 중지 절대적 어디에도 없습니다
+0

Acquire/Release 대신 Acquire에서 일회용 개체를 반환하고 해당 개체에 대한 Dispose를 감소시켜야합니다. 프로그래머는 Acquire의 각 사용을 using() 문으로 보호 할 수 있습니다. 만약 그들이 엉망이라면 적어도 종료 자 (finalizer)가 뒤따라 정리할 것입니다. –

+0

@Chris, 나는 OP의 의도를 잘못 해석했다고 생각합니다. 코드에서 여러 "물건"에 사용되어 더 이상 사용되지 않을 때 처분되는 일회용 개체를 갖고 싶습니다. Acquire에 의해 반환 된 항목이 Disposed이면 더 이상 사용할 수 없습니다. * Double * 래퍼를 제안하지 않는 한, RefCountingWrapper .Acquire는 래퍼 을 반환합니다. 래퍼 . 사용법은 using() 블록에서 사용됩니까? 그게 실제로 "일하는"코드보다 복잡하고 더 많은 래퍼 코드를 만들기 시작합니다. – Rob

+0

아니, 그게 내가 생각하는 것입니다. 이 래퍼 클래스에 약간 더 많은 코드가 필요할지라도이 코드가 사용되는 모든 곳을 단순화합니다. 표준 .Net 숙어를 재사용하는 것은 새로운 프로세스를 모두 만드는 것보다 낫습니다. 그다지 많은 코드가 아니라, "Release"를 "Dispose"로 이름을 바꾼 다음 다른 클래스로 옮깁니다. –

2

정말 두 가지 옵션이 있다고 생각합니다.

1) 누군가가 해당 객체를 소유하고 있으며 해당 객체에 대한 액세스를 제어합니다. 그러므로 아무도 더 이상 필요가 없다고 결정하면 처분해야합니다. 이것은 오래된 오래된 수동 리소스 관리입니다.

2) GC를 처리하고 인스턴스에서 finalizer를 호출하기 위해 GC가 기다려야합니다. IDisposable을 구현하는 모든 객체에는 Dispose가 호출되지 않으면 sam elogic을 처리하는 finalizer가 있어야합니다. 처리를 호출하면이 추가 단계를 수행 할 필요가 없으며 GC가 더 효율적입니다.

+0

내가 만들 수 리소스를 많이 가지고 그것을 처리해야하기 때문에 # 2, 실용적이지 않다 적시에 메모리를 소모하지 않도록하십시오. – Benny

관련 문제