这就是重点,我有一个 WCF 服务,它现在正在工作。所以我开始在客户端工作。当应用程序运行时,出现异常:超时。所以我开始阅读,有很多关于如何保持连接活跃的例子,但是,我也发现最好的方法是创建通道,使用它,然后处理它。老实说,我喜欢这样。所以,现在阅读关闭频道的最佳方法,有两个链接可能对任何需要它们的人有用:
在第一个链接中,这是示例:
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
因此,如果通道不为 null,则关闭、处置并分配 null。但我有一个小问题。在此示例中,通道具有 .Close() 方法,但在我的情况下,智能感知没有显示 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);
是的,我认为它真的非常好,我想了解它以便在我的项目中使用它。
而且,像往常一样,我希望这对很多人都有帮助。