我有一个在自托管环境中运行的net.tcp WCF服务。我设置了一个强制方案,服务器将运行一个服务方法足够长的时间,以便客户端时间输出。即:
[OperationContract]
public bool someMethod() {
Thread.Sleep(60000);
return true;
}
在客户端:
public void callSomeMethod() {
using (var proxy = getProxy()) {
proxy.someMethod();
}
}
当客户端在60秒后超时时,服务器上会泄漏一个或多个句柄。反复执行此操作最终会导致服务器崩溃,因为资源不足。
注意:在客户端上,我故意不使用Close()/ Abort()进行此测试。我的理论是,如果客户端连接到服务器但在连接被清除之前被中断,则服务器将泄漏。
最后一句话 - 当我查看ProcessExplorer时,它显示我的泄漏是TCP套接字。
有没有更好的方法来处理这个服务器端?我已经看到了使用ChannelFactory的引用,但我不确定细节(即使是服务器端代码?)如果是这样,它是否会让我更加控制以确保错误状态得到正确清理? / p>
修改
我已经在ChannelFactory上做了一些搜索,我发现它是一个客户端功能,而不是服务器端,所以无视它。关于是否有办法更好地清理泄漏的港口仍然是开放的。
答案 0 :(得分:2)
事实证明,我是从[STAThread]运行我的服务 - 只要应用程序使用COM调用,除非您正在运行[MTAThread]模式,否则您可能会泄漏内存。