В этом все дело, у меня есть служба WCF, она работает сейчас.Поэтому я начинаю работать на стороне клиента.И когда приложение работало, возникло исключение: тайм-аут.Итак, я начал читать, есть много примеров того, как сохранить соединение живым, но я также обнаружил, что лучший способ - создать канал, использовать его и распоряжаться им.И, честно говоря, мне это понравилось.Итак, теперь, читая о лучшем способе закрытия канала, есть две ссылки, которые могут быть полезны всем, кто в них нуждается:
1. Очистите клиентов правильным способом
2.Использование Func
В первой ссылке это пример:
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
Итак, если канал не нулевой, то он закрывается, удаляется и присваивается ноль.Но у меня есть маленький вопрос.В этом примере у канала есть метод .Close (), но в моем случае intellisense не показывает метод Close ().Он существует только на заводском объекте.Поэтому я считаю, что должен написать это.Но в интерфейсе, у которого есть контракты, или в классе, который его реализует?И что должен делать этот метод ??
Теперь, по следующей ссылке, у меня есть кое-что, чего я раньше не пробовал.Func<T>
.И после прочтения цели это довольно интересно.Он создает функцию, которая с помощью lambdas создает канал, использует его, закрывает и пропускает его.Этот пример реализует эту функцию как оператор Using()
.Это действительно хорошо, и отличное улучшение.Но мне нужна небольшая помощь, если честно, я не могу понять функцию, поэтому небольшое объяснение от эксперта будет очень полезно.Это функция:
TReturn UseService<TChannel, TReturn>(Func<TChannel, TReturn> code)
{
var chanFactory = GetCachedFactory<TChannel>();
TChannel channel = chanFactory.CreateChannel();
bool error = true;
try {
TReturn result = code(channel);
((IClientChannel)channel).Close();
error = false;
return result;
}
finally {
if (error) {
((IClientChannel)channel).Abort();
}
}
}
И вот как это используется:
int a = 1;
int b = 2;
int sum = UseService((ICalculator calc) => calc.Add(a, b));
Console.WriteLine(sum);
Да, я думаю, это действительно очень хорошо, я хотел бы понять, как это использоватьэто в моем проекте.
И, как всегда, я надеюсь, что это может быть полезно для многих людей.