이것이 바로 WCF 서비스를 사용하는 요점입니다. 그래서 저는 고객 측에서 일하기 시작합니다. 그리고 응용 프로그램이 실행 중일 때 예외가 발생했습니다 : 시간 초과. 그래서 나는 연결을 유지하는 방법에 대한 많은 예제가 있지만, 가장 좋은 방법은 채널을 만들고 사용하고 폐기하는 것입니다. 그리고 솔직히, 나는 그것을 좋아했다. 그래서, 지금 채널을 폐쇄하는 가장 좋은 방법에 대한 책을 읽은 그들 필요가있는 사람에게 도움이 될 수있는 두 개의 링크가 있습니다 : 첫 번째 링크에서C# WCF 클로징 채널 및 함수 사용 Func <T>
1. Clean up clients, the right way
는, 이것은 예입니다 :
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
따라서 채널이 null이 아니면 닫히고 폐기하고 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);
그래, 난 정말, 정말 좋은 생각, 내가 프로젝트에서 사용하는 그것을 이해하고 싶습니다 나는 가지고있다.
항상 그렇듯이 많은 사람들에게 도움이되기를 바랍니다.
고맙습니다.
사실 제 질문은 채널에 관한 것이 아니라 Generics에 관한 것입니다. 나는 아직도 이것에 붙어있다. 'UseService' 함수를 설명하는 데 도움이 될 것입니다! – BlackCath