2017-05-17 7 views
0

소켓 서버 프로그램을 작성 중입니다. 특정 IP 및 포트를 수신합니다. 데이터가 들어 오면 데이터를 처리하여 데이터베이스에 저장합니다. 데이터 수신 여부에 관계없이 내 프로그램에서 24 * 7 수신 대기합니다. 다음 제공을 처리 할 경우 새로운 클라이언트가 잘 작동하지만 잠시 후 메모리 예외 벗어나 려하고있어 여기에OutOfMemoryException 비동기 소켓 서버

에 합류 샘플 코드


static async Task AcceptClientsAsync(TcpListener listener, CancellationToken ct) { try { var clientCounter = 0; while (!ct.IsCancellationRequested) { TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(true); clientCounter++; EchoAsync(client, clientCounter, ct); } } catch (Exception e) { NewLog.WriteErrorLogToBuffer("exception in AcceptClientsAsync " + e.InnerException, false); } }

때까지 그렇지 않으면 기다립니다. 이 문제를 해결할 방법이 있습니까?

답변

1

TcpClient 인스턴스는 절대로 처리되지 않으므로 프로그램이 메모리가 부족해져 OS에서 종료 될 때까지 열린 상태로 유지됩니다.

사용을 마친 후에 TcpClient을 닫아야합니다. 수동으로이 Close() 방법을 사용하여 폐쇄,하지만 예외가 Close() 당신의 TcpClient 호출하기 전에 발생하면 것을 알고 있어야

using(TcpClient client = await listener.AcceptTcpClientAsync().ConfigureAwait(true)) 
{ 
    clientCounter++; 
    EchoAsync(client, clientCounter, ct); 
} 

대안은 이렇게하는 가장 좋은 방법은 using 블록 내부를 포장하는 것입니다 영원히 열려있을 것이다.