Когда располагать объект wcf с асинхронным шаблоном
-
06-07-2019 - |
Вопрос
Предположим, я начинаю с синхронной версии:
using(var svc = new ServiceObject()) {
var result = svc.DoSomething();
// do stuff with result
}
Я заканчиваю с
var svc = new ServiceObject();
svc.BeginDoSomething(async => {
var result = svc.EndDoSomething(async);
svc.Dispose();
// do stuff with result
},null);
1) Это правильное место для вызова Dispose ()?
2) есть ли способ использовать использование ()?
Решение
Из блога Rotem Bloom: http: // caught-in-a-web.blogspot.com/2008/05/best-practices-how-to-dispose-wcf.html р>
Рекомендации: как избавиться от клиентов WCF
Использование оператора using (Using в Visual Basic) не рекомендуется для клиентов Dispose WCF. Это связано с тем, что конец оператора using может вызвать исключения, которые могут маскировать другие исключения, о которых вам может потребоваться знать.
using (CalculatorClient client = new CalculatorClient())
{
...
} // this line might throw
Console.WriteLine("Hope this code wasn't important, because it might not happen.");
The correct way to do it is:
try
{
client.Close();
}
catch (CommunicationException)
{
client.Abort();
}
catch (TimeoutException)
{
client.Abort();
}
catch
{
client.Abort();
throw;
}
Другие советы
Поскольку ваша служба не будет получать доступ к каким-либо неуправляемым ресурсам, почему бы не позволить ей выйти из области действия и позволить GC делать свое дело?