Утилизация объектов WCF

Если у меня есть цикл, в котором я создаю CommunicationObject (точнее ClientBase), есть ли необходимость вызывать функцию Close() после ее использования?

while(true)
{
 Service client = new Service();
 client.Close() // is in necessary? 
}

CommunicationObject использует какие-либо системные ресурсы, которые все еще остаются после сбора CLR? и если так, что случится, если я не закрою это? есть ли вероятность отбросить услугу?

1 ответ

Да, вам нужно закрыть его. На самом деле Сервис одноразовый, поэтому используйте оператор использования как таковой:

using(var client = new Service()){
   ...
} // <-- this line will trigger the Close();

Хотя есть небольшая проблема. Метод Close может вызвать исключение в случае сбоя состояния клиента. Правильная вещь будет выглядеть примерно так:

try
{
    ...
    client.Close();
}
catch (CommunicationException e)
{
    ...
    client.Abort();
}
catch (TimeoutException e)
{
    ...
    client.Abort();
}
catch (Exception e)
{
    ...
    client.Abort();
    throw;
}

Как предлагается здесь: https://msdn.microsoft.com/en-us/library/aa355056%28v=vs.110%29.aspx

Лично я нахожу это немного излишним.. Я всегда просто использую оператор using. (первый пример кода)

Другие вопросы по тегам