Когда располагать объект wcf с асинхронным шаблоном - PullRequest
5 голосов
/ 17 июня 2009

Предположим, я начинаю с синхронной версии:

 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) есть ли способ использовать использование ()?

Ответы [ 2 ]

5 голосов
/ 18 июня 2009

Из блога 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;
}
0 голосов
/ 18 июня 2009

Поскольку ваша служба не будет обращаться к каким-либо неуправляемым ресурсам, почему бы не позволить ей выпасть из области видимости и позволить GC делать свое дело?

...