当客户端超时时,WCF服务会泄漏句柄和内存

时间:2011-10-04 22:09:34

标签: wcf c#-4.0

我有一个在自托管环境中运行的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上做了一些搜索,我发现它是一个客户端功能,而不是服务器端,所以无视它。关于是否有办法更好地清理泄漏的港口仍然是开放的。

1 个答案:

答案 0 :(得分:2)

事实证明,我是从[STAThread]运行我的服务 - 只要应用程序使用COM调用,除非您正在运行[MTAThread]模式,否则您可能会泄漏内存。

相关问题