2013-07-19 3 views
1

나는 C#을 사용하여 합리적으로 경험했지만 이전에는이 ​​문제를 경험하지 못했습니다. 경험이 풍부한 C# 개발자가이 상황에서해야 할 일을 알고 있는지 궁금합니다. 내가 코드 블록에 사용하여 문을 사용 할 필요가있는 경우 (문제가 코드 블록 이후 설명)스레딩을 사용하여 블록 사용

public void ConnectToRemoteServer() 
{ 
    Console.WriteLine("Attempting to connect to " + config.GetString(ConfigParams.MasterServerIp) + ":" + config.GetString(ConfigParams.MasterServerPort)); 
    TcpClient client = new TcpClient(); 
    IPEndPoint address = new IPEndPoint(IPAddress.Parse(config.GetString(ConfigParams.MasterServerIp)), config.GetInt(ConfigParams.MasterServerPort)); 
    Console.WriteLine("Connecting..."); 
    //Begin asynchronous sever communication 
    if (this.autoTask == null) 
    { 
     communicator = new CommunicationListener(client, config, address); 
    } 
    else 
    { 
     communicator = new CommunicationListener(client, config, address, this.autoTask); 
    } 
    Thread communicationThread = new Thread(new ThreadStart(communicator.Start)); 
    communicationThread.Start(); 
} 

부분 I 대해 궁금하네요있다 : 여기서 문제가되는 방법에 대한 코드입니다. 나는 TcpClient이 인터페이스 IDisposable을 구현 했으므로 using 문에 캡슐화해야한다는 것을 알고 있습니다. 그러나이 경우 TcpClient을 사용하는 새 스레드가 시작되고 using 블록의 끝 부분에 도달하기 전에 TcpClient이 사용되었습니다. 여기 using 성명을 사용해야합니까?

+0

이 communcationsThread는 끝날 것입니까?또는 그것은 전체 시간을 실행할 것인가? 응용 프로그램이 종료 될 때까지 멈추지 않을 청취자처럼 들리는 소리. – Visions

+1

이 경우에는 필요한 값을 다른 스레드로 전달한 다음 스레드에서 CommunicationListener 인스턴스를 인스턴스화하고 처리하도록하는 것이 더 바람직 할까 궁금합니다. 그렇다면 아직도 사용하고있는 물건을 처분하려는 데 이상한 행동의 위험을 감수하고 있지 않습니다. –

+2

나는이 블록에서 using 블록의 끝에 암시 적 close() 결과를 사용 했으므로이 블록을 사용하지 않는 것이 옳다고 생각한다. 나는 이것이 블로깅을 사용하는시기에 대한 일반적인 조언이 "언제나 객체가 IDisposable을 함축하고있을 때"라는 점에서 상당히 일반적인 악화 원인이라고 생각합니다. –

답변

1

일반적인 규칙은 IDisposable 인 경우 해당 개체를 처리해야한다는 것입니다.

블록을 사용하면 쉽게 처리 할 수 ​​있지만, TCPClient는이 메서드 외부에서 지속되므로이 경우에는 사용할 수 없습니다.

정말 멋진 코드를 작성하고 싶다면; 클래스 내에서 TCPClient를 선언하고 클래스에서 IDisposable을 구현하도록하고 새 Dispose 메서드 내에서 TCPClient를 삭제하십시오. (그리고 아마도 스레드를 끝내기에 대해 뭔가를 할).

이렇게하면 블록을 사용하여 클래스를 래핑 할 수 있습니다.

+0

좋아, 그 말이 많이 있습니다. 나는 사실 내 클래스 중 하나를 전에 IDisposable을 구현하도록 만들지 않았습니다. (필자가 정말로 필요로하지 않았기 때문입니다.)하지만 그건 의미가 있습니다. 답변 해주셔서 감사합니다! – slazarus

2

초기 폐기로 인해 프로그램이 작동하지 않으므로 여기에서 사용하지 마십시오. TcpClient을 새 스레드에 올바르게 전달하고 스레드가 결국 스레드를 폐기하는지 확인하십시오.

나는 TcpClient을 자식 스레드에 만들어서 using을 사용할 수 있다고 생각합니다.

0

다른 종류의 문제가 있다고 생각합니다. CommunicationListener에 IDisposable을 구현하고 거기에서 TcpClient를 인스턴스화하고 TcpClient를 CommunicationListener.Dispose 구현에 배치해야합니다.

언제 CommunicationListener를 처리하는 것이 좋을까요? 다릅니다.

2

나는이 블록에서 using 블록의 끝에 암시 적 close() 결과를 사용 했으므로이 블록을 사용하지 않는 것이 옳다고 생각합니다. 나는 이것이 블로깅을 사용하는시기에 대한 일반적인 조언이 "언제나 객체가 IDisposable을 함축하고있을 때"라는 점에서 상당히 일반적인 악화 원인이라고 생각합니다.

다음은 IDisposable 구현에 관계없이 사용하지 않을 때 대한 최종 문서입니다. http://msdn.microsoft.com/en-us/library/aa355056.aspx.

+0

기사에 대한 링크 플러스 – slazarus

0

이 메서드가있는 클래스와 CommunicationListener를 모두 처분 할 수 있습니다. 그런 다음 자신의 클래스가 삭제 될 때 다른 스레드가 실행되지 않도록 플래그를 설정하여 통신 수신기의 스레드를 취소하는 방법을 구현할 것입니다. 그런 다음 부모 클래스의 Dispose에서 CommunicationListener를 중지하고 CommunicationListener를 삭제할 수 있도록 플래그를 설정합니다. 그러면 CommunicationListener가 처리되고 TcpClient가 내부적으로 두 배가됩니다.

나는 그것이 의미가 있기를 바랍니다.

관련 문제