#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();