2017-01-05 5 views
0

Я пытаюсь создать асинхронный метод, чтобы проверить, могу ли я подключиться к хосту через TCP. Похоже, я не правильно отлаживаю всю память, которую я использую.C# - освобождение памяти для асинхронного подключения TcpClient

Я что-то забыл?

Мой индикатор Подключение:

Bool CanConnectToHost = false; 

Моя Функция:

private async void TryToConnectToHost() 
    { 
     // host IP Address and communication port 
     string ipAddress = Properties.Settings.Default.HostIPaddr; 
     int port = 9100; 

     //Try to Connect with the host 
     try 
     { 
      TcpClient client = new TcpClient(); 

      await client.ConnectAsync(ipAddress, port); 

      //Verify if connected succesfully 
      if (client.Connected) 
      { 
       //Connection with host 
       CanConnectToHost = true; 
      } 
      else 
      { 
       // No connection with host 
       CanConnectToHost = false; 
      } 

      //Close Connection 
      client.Close(); 
     } 
     catch (Exception exception) 
     { 
      //Do Something 
     } 
    } 

Thx много

+3

Почему вы думаете, не отпуская все ресурсы? Btw. более подходящий для использования используется оператор using (TcpClient client = new TcpClient()) {.....} ' Вам не нужно вызывать' client.Close() ', и он также закроет клиента, если исключение. –

ответ

1
  1. Я не думаю, что вы должны заботиться о памяти здесь. То, что вы, вероятно, наблюдаете, заключается в том, что сборник мусора не беспокоится о том, чтобы очистить всю память сразу после завершения вашего метода. Он будет делать это в конечном итоге, когда у него будет время или ваш процесс начнет исчерпывать свободную память.

  2. TcpClient.ConnectAsync() throws a SocketException если соединение не может быть установлено. Таким образом, ваш код имеет недостаток, что в случае этого исключения вы не устанавливаете свой CanConnectToHost правильно (хотя он инициализируется false).
    Я рекомендую использовать здесь using. Это также имеет то преимущество, что Close() также будет вызываться в случае исключения. И Close() также бесплатно освободит любые ресурсы, используемые TcpClient, и не только, если GC начнет работать.

Ваш код с using:

private async void TryToConnectToHost() 
{ 
    // host IP Address and communication port 
    string ipAddress = Properties.Settings.Default.HostIPaddr; 
    int port = 9100; 

    //Try to Connect with the host 
    try 
    { 
     using (TcpClient client = new TcpClient()) 
     { 
      await client.ConnectAsync(ipAddress, port); 
      CanConnectToHost = client.Connected; // no need for if 
     } 
    } 
    catch (Exception exception) 
    { 
     CanConnectToHost = false; 
    } 
} 
+0

Большое спасибо, очень ясный и полезный ответ. :) –

Смежные вопросы