这是要翻译的内容:
重点在这里,我有一个 WCF 服务,它现在正在工作。所以我开始在客户端上工作。当应用程序运行时,出现了一个异常:超时。于是我开始阅读,有许多关于如何保持连接活动的示例,但是我发现最好的方法是创建通道,使用它,并且释放它。老实说,我很喜欢这种方法。现在,关于关闭通道的最佳方式的阅读,有两个链接可能对任何需要它们的人有用:
在第一个链接中,这是示例:
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
因此,如果通道不为null,则关闭、清理并分配null。但我有一个小问题。在这个例子中,通道有一个.Close()方法,但是,在我的情况下,智能提示没有显示Close()方法。它只存在于工厂对象中。所以我相信我必须自己编写它。但是,在具有契约的接口或实现它的类中应该怎么写呢?而且,这个方法应该做些什么?
现在,下一个链接,这是我以前没有尝试过的东西。Func<T>
。阅读目标后,它非常有趣。它创建一个函数,使用lambda创建通道,使用它,关闭它并释放它。这个例子将该函数实现为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);
是的,我认为这真的非常好,我想了解如何在我拥有的项目中使用它。
而且,像往常一样,我希望这对很多人有所帮助。