Действительно ли мне нужно вызывать CloseAsync с помощью WCF

#silverlight #wcf

#silverlight #wcf

Вопрос:

Если у меня есть функция в silverlight, которая похожа на эту:

     authenticationServiceClient.testCompleted  = callback;
    authenticationServiceClient.testAsync();
  

Мне действительно нужно вызывать closeasync или это будет вызвано для меня, когда программа будет завершена?

authenticationServiceClient — это локальная переменная для функции/

Ответ №1:

Когда программа будет завершена, все открытые соединения будут закрыты.

Если вы хотите избавиться от ресурса во время работы программы, то это зависит от привязки, используемой клиентом. Если вы имеете дело с HTTP-привязкой, то вызов Close [Async] на самом деле не является необходимым; если вы имеете дело с TCP-привязкой, то Close фактически закроет сокет, который остается открытым (в течение некоторого времени).

Ответ №2:

Я всегда следую этому шаблону с Silverlight:

 // Call
serviceClient.CallMethodCompleted  = (s, a) =>
{
    // Error?
    if (a.Error == null)
    {
        // Do something
    }
    else
    {
        // Handle error
    }

    // Close
    serviceClient.CloseAsync();
};

// Call
serviceClient.CallMethodAsync();
  

В этом нет необходимости, но это полезно сделать, поскольку в браузере есть HTTP keep-alives и небольшая уборка никогда никому не повредит.

Комментарии:

1. насколько я понимаю, вам не обязательно указывать это в обратном вызове. попробуйте это как-нибудь.

Ответ №3:

Есть несколько шаблонов (которым я также следую), чтобы закрыть proxyclient сразу после вызова метода, а не при обратном вызове. В этом случае код выглядит чище, и вы можете использовать не только lambda в обратных вызовах, но и делегировать функции. что-то вроде этого:

 ....
serviceClient.CallMethodCompleted  = (s, a) =>.....
// Call
serviceClient.CallMethodAsync();
// Close
serviceClient.CloseAsync();