C# 多次调用后WCF中的TimeoutException

C# 多次调用后WCF中的TimeoutException,c#,.net,wcf,timeout,duplex-channel,C#,.net,Wcf,Timeout,Duplex Channel,也许我没有正确地实现WCF,但在多次调用后使用NetNamedPipedBindings时,我似乎遇到了WCF异常 以下是我正在做的高水平工作。基本上,我正在处理一个out-of-proc-exe,并使用WCF命名的管道来来回通信。我通过此属性使主机保持打开状态: [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)]

也许我没有正确地实现WCF,但在多次调用后使用
NetNamedPipedBindings
时,我似乎遇到了WCF异常

以下是我正在做的高水平工作。基本上,我正在处理一个out-of-proc-exe,并使用WCF命名的管道来来回通信。我通过此属性使主机保持打开状态:

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, 
    ConcurrencyMode = ConcurrencyMode.Multiple)]
然后,在我的客户机中,我创建了一个
静态DuplexChannelFactory
,实例化一次,然后根据需要通过以下方式使用:

channelFactory.CreateChannel().MakeCall();
我添加了一个Ping方法,只是为了确保主机正常工作(因为主机将发送我们不希望在不知道的情况下错过的事件)。此Ping方法每5秒运行一次,只返回一个true。然而,在运行几分钟后,我得到了一个
TimeoutException
。这是我的异常跟踪:

服务器堆栈跟踪:在 System.ServiceModel.Channel.ClientFramingDuplexSessionChannel.OnOpen(TimeSpan 超时)在 System.ServiceModel.Channel.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channel.ServiceChannel.OnOpen(TimeSpan超时)
打开System.ServiceModel.Channels.CommunicationObject.Open(时间跨度 超时)在 System.ServiceModel.Channels.ServiceChannel.CallOpenOnce.System.ServiceModel.Channels.ServiceChannel.iAllonce.Call(ServiceChannel 通道,时间间隔(超时) System.ServiceModel.Channels.ServiceChannel.CallOnceManager.CallOnce(TimeSpan 超时,CallonManager(级联)位于 System.ServiceModel.Channels.ServiceChannel.com重新打开(TimeSpan 超时)在System.ServiceModel.Channels.ServiceChannel.Call(字符串 操作,布尔单向,ProxyOperationRuntime操作,对象[]ins, 对象[]输出,TimeSpan超时)位于 System.ServiceModel.Channel.ServiceChannel.Call(字符串操作, 布尔单向,ProxyOperationRuntime操作,对象[]ins, 对象[]输出]位于 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage 方法调用,ProxyOperationRuntime操作)在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage (信息)

我打开了JustDecompile,发现这个错误很可能发生在这里:

connection = this.connectionPoolHelper.EstablishConnection(timeout)
但是,我看不出有什么原因会在之前工作了几次ping之后超时?我需要设置什么样的设置才能使这个无限和/或是否有其他方法可以从客户端或服务器端实现这个WCF事件服务器(它也用于按需处理)

更新


在我开始看到调用尝试和不返回之前,我进行了大约6次ping。

您应该使用来自sysinternals的命令来查看是否继续不必要地创建新管道。它们将显示为guid。请参阅。

问题在于,如果出现问题,您无法反复调用
CreateChannel
。没有dispose方法,因为这只是我的WCF接口的代理。因此,我只是通过存储对代理的引用并在主机需要重新实例化时重新创建它来解决这个问题

你会认为会有一些关于这方面的文档。尤其是当博客被写在多次调用CreateChannel的地方时,这一点尤其没有帮助

更新:

如果链接死亡,则剪断代码:

您必须使用强制转换到IClientChannel的using,然后在using中重置引用。频道将正常关闭,但您的引用将保持打开状态。注意演员阵容

using (IClientChannel client = (IClientChannel)channelFactory.CreateChannel())
{
    var proxy = (IMyInterface)client;
}

我看不出有什么原因会在之前工作几分钟后超时?-这实际上很有道理,并将其标记为资源泄漏。您没有关闭/处理某些内容。@HenkHolterman好的,但服务器或客户端上的内容是什么?我是否应该多次呼叫CreateChannel?也许创建频道并反复使用它?我的猜测是它在客户端的某个地方,因为我可以保持服务器运行,杀死客户端,然后在客户端重新启动时它会工作一点。嗯,6次ping是半分钟,而不是几分钟。我不太熟悉双工通道,但我会说每次使用后保持打开或处理。池的存在意味着后者,使用
using(){}
模式。@HenkHolterman我将尝试一下,并更新我的问题。几分钟后,我得到了第一个异常,多线程计时器将我抛出。您可以将通道引用强制转换为IClientChannel,或直接转换为IDisposable。然后只使用using。我必须尝试一下,但是如果我这样做了,我能使用我的类和方法吗?