这就是重点,我有一个 WCF 服务,它现在正在运行。所以我开始在客户端工作。当应用程序运行时,出现异常:超时。所以我开始阅读,有很多关于如何保持连接的例子,但是,我也发现最好的方法是创建 channel ,使用它,然后处理它。老实说,我喜欢这样。因此,现在阅读有关关闭 channel 的最佳方法,有两个链接可能对任何需要它们的人都有用:
1. Clean up clients, the right way
在第一个链接中,这是示例:
IIdentityService _identitySvc;
...
if (_identitySvc != null)
{
((IClientChannel)_identitySvc).Close();
((IDisposable)_identitySvc).Dispose();
_identitySvc = null;
}
因此,如果 channel 不为空,则关闭、处置并分配空值。但我有一个小问题。在这个例子中, channel 有一个 .Close() 方法,但在我的例子中,intellisense 没有显示 Close() 方法。它只存在于工厂对象中。所以我相信我必须写它。但是,在具有契约的接口(interface)或实现它的类中??。而且,这个方法应该做什么??。
现在,下一个链接,这是我以前没有尝试过的东西。 Func<T>
.而且看完球门,还蛮有意思的。它创建了一个函数,该函数使用 lambdas 创建 channel 、使用它、关闭它并处理它。这个例子像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);
是的,我认为它真的非常好,我想了解它以便在我的项目中使用它。
而且,一如既往,我希望这对很多人有所帮助。
最佳答案
UseService 方法接受一个委托(delegate),它使用 channel 发送请求。委托(delegate)有一个参数和一个返回值。您可以在委托(delegate)中调用 WCF 服务。
并且在 UseService 中,它创建 channel 并将 channel 传递给委托(delegate),这应该由您提供。调用结束后关闭 channel 。
关于C# WCF 关闭 channel 并使用函数 Func<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6728212/