2011-11-23 2 views
1

을 통해 생성 된 Stream이 있다고 해봅시다. 내가 stream.Dispose() 인 경우 Stream을 생성 한 TcpClient을 처분해야합니까?TcpClient 자원 처분

답변

3

ILSpy에서 TcpClient.GetStreamTcpClient.Dispose의 구현을 살펴보면, 스트림에서는 Dispose()을 호출하지만 클라이언트에서는 호출하지 않으면 리소스 누출이 없어야한다는 데 동의합니다.

그러나 어쨌든 좋은 아이디어라고 확신하지는 않습니다.

나는 TcpClient의 인스턴스에서 Dispose()을 호출하는 것을 피하기를 원합니다. TcpClientIDisposable을 구현한다는 사실에 의해 암시 된 계약은 인스턴스가 더 이상 필요하지 않을 때 Dispose()을 호출해야한다는 것입니다.

이 계약을 깰 경우

  • 그것은 코드의 미래의 관리자들에게 혼동이 될 것입니다?
  • TcpClient의 구현이 이후 버전에서 변경되면 어떻게 될까요?
+0

이것은 의존성 주입 엉킴으로 귀결되는 결과입니다. 이 리소스 정리 문제에 직면하는 가장 좋은 방법은 거의 확실합니다. 답변을 읽으면 구현 세부 사항에 의존하는 것이 어렵다는 것을 상기시켜줍니다. – spender

0

확인. 반사경에게 나 자신을 확인시켜 줬어. TcpClientGetStream을 호출하면 멤버 m_DataStream이 null이 아닌 값으로 초기화됩니다. 내가 스트림 자신을 처분하는 경우하여 TcpClient에 의해 수행, 나는이 같은 처리를 수행하고있어, 따라서

 IDisposable dataStream = this.m_DataStream; 
     if (dataStream != null) 
     { 
      dataStream.Dispose(); 
     } 
     else 
     { 
      //some other disposal strategy 
     } 

:

하여 TcpClient의 처분 방법의 본문은 다음과 같이 보입니다.

내가 알 수있는 한, 스트림을 처리하면 TcpClient를 처리하는 데 불필요합니다.

누군가 동의하지 않습니까?

+1

(제거 된 주석에 대한 응답으로) 스트림이있는 경우 TcpClient가 수행하는 유일한 처리 작업입니다. 따라서 스트림을 처리하면 TcpClient를 수행 할 필요가 없습니다. 따라서 스트림을 수동으로 처리하지 않아도 아무 것도하지 않기 때문에 TcpClient를 처리 할 필요가 없습니다. – spender