파이프 라인 패턴을 구현 중입니다. 이미지 객체와 같은 리소스가 파이프 라인을 통과 할 것이고 리소스가 얼마나 많은 클라이언트가 리소스를 보유하고 있는지 알 수 없으므로 리소스를 처리하는 더 좋은 방법은 무엇입니까?여러 클라이언트에서 리소스를 사용할 때 리소스를 폐기하는 방법은 무엇입니까?
1
A
답변
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()를 호출로부터 획득 자원을 사용하고 코드를 중지 절대적 어디에도 없습니다
2
정말 두 가지 옵션이 있다고 생각합니다.
1) 누군가가 해당 객체를 소유하고 있으며 해당 객체에 대한 액세스를 제어합니다. 그러므로 아무도 더 이상 필요가 없다고 결정하면 처분해야합니다. 이것은 오래된 오래된 수동 리소스 관리입니다.
2) GC를 처리하고 인스턴스에서 finalizer를 호출하기 위해 GC가 기다려야합니다. IDisposable을 구현하는 모든 객체에는 Dispose가 호출되지 않으면 sam elogic을 처리하는 finalizer가 있어야합니다. 처리를 호출하면이 추가 단계를 수행 할 필요가 없으며 GC가 더 효율적입니다.
+0
내가 만들 수 리소스를 많이 가지고 그것을 처리해야하기 때문에 # 2, 실용적이지 않다 적시에 메모리를 소모하지 않도록하십시오. – Benny
관련 문제
- 1. 여러 데이터베이스에 활성 리소스를 사용하는 방법은 무엇입니까?
- 2. Struts에 여러 메시지 리소스를 포함시키는 방법은 무엇입니까?
- 3. Maven Jetty Plugin을 사용할 때 리소스를 필터링하는 방법은 무엇입니까?
- 4. ActionLink에서 리소스를 사용하는 방법은 무엇입니까?
- 5. hdpi 리소스를 사용할 때 Android 앱이 느려집니다.
- 6. 활성 리소스를 스텁하는 방법은 무엇입니까?
- 7. 네이티브 리소스를 재정의하는 방법은 무엇입니까?
- 8. 리소스를 폴더로 구성하는 방법은 무엇입니까?
- 9. 전역 디스크 리소스를 사용할 수 없게됩니다.
- 10. 프로그램의 컴퓨팅 리소스를 제한하는 방법은 무엇입니까?
- 11. JNDI 리소스를 정의하는 방법
- 12. Boost ASIO에서 리소스를 일시적으로 사용할 수 없습니다.
- 13. Jar 파일 리소스를 사용할 수 없습니까?
- 14. MVC - 컨트롤러에 리소스를 처리하십시오.
- 15. 수락 오류 : 리소스를 일시적으로 사용할 수 없습니다.
- 16. 리소스를 잠급니다.
- 17. 포인터를 클래스에 전달할 때 누가 리소스를 관리해야합니까?
- 18. HttpPostedFileBase에서 사용하는 리소스를 해제하는 방법은 무엇입니까?
- 19. iphone 정적 라이브러리에 리소스를 포함시키는 방법은 무엇입니까?
- 20. BPL 내에서 리소스를 추출하는 방법은 무엇입니까?
- 21. xaml에서 WPF 리소스를 복사하는 방법은 무엇입니까?
- 22. 런타임 중에 어셈블리에 리소스를 추가하는 방법은 무엇입니까?
- 23. Eclipse Plugin에서 리소스를 새로 고치는 방법은 무엇입니까?
- 24. ControlTemplate에서 애니메이션 리소스를 얻는 방법은 무엇입니까?
- 25. 리소스를 단일 실행 파일에 포함시키는 방법은 무엇입니까?
- 26. 이 방법으로 ASP.NET 리소스를 사용하는 방법은 무엇입니까?
- 27. JarPackageFragmentRoot에서 리소스를 가져 오는 방법은 무엇입니까?
- 28. 임베디드 리소스를 출력 디렉토리에도 복사하는 방법은 무엇입니까?
- 29. WP7 : 정적 리소스를 재정의하는 방법은 무엇입니까?
- 30. Qt 리소스를 공유 라이브러리에서 초기화하는 방법은 무엇입니까?
Acquire/Release 대신 Acquire에서 일회용 개체를 반환하고 해당 개체에 대한 Dispose를 감소시켜야합니다. 프로그래머는 Acquire의 각 사용을 using() 문으로 보호 할 수 있습니다. 만약 그들이 엉망이라면 적어도 종료 자 (finalizer)가 뒤따라 정리할 것입니다. –
@Chris, 나는 OP의 의도를 잘못 해석했다고 생각합니다. 코드에서 여러 "물건"에 사용되어 더 이상 사용되지 않을 때 처분되는 일회용 개체를 갖고 싶습니다. Acquire에 의해 반환 된 항목이 Disposed이면 더 이상 사용할 수 없습니다. * Double * 래퍼를 제안하지 않는 한, RefCountingWrapper.Acquire는 래퍼 을 반환합니다. 래퍼 . 사용법은 using() 블록에서 사용됩니까? 그게 실제로 "일하는"코드보다 복잡하고 더 많은 래퍼 코드를 만들기 시작합니다. –
Rob
아니, 그게 내가 생각하는 것입니다. 이 래퍼 클래스에 약간 더 많은 코드가 필요할지라도이 코드가 사용되는 모든 곳을 단순화합니다. 표준 .Net 숙어를 재사용하는 것은 새로운 프로세스를 모두 만드는 것보다 낫습니다. 그다지 많은 코드가 아니라, "Release"를 "Dispose"로 이름을 바꾼 다음 다른 클래스로 옮깁니다. –