Утилизация объектов 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. (первый пример кода)