C# 保持WCF连接始终打开,而不是在每次呼叫时重新创建客户端
这是该问题的后续问题: 在连接关闭后尝试重新打开与客户端的连接时,我还遇到了“无法访问已处理对象”异常。我是这样做的:C# 保持WCF连接始终打开,而不是在每次呼叫时重新创建客户端,c#,wcf,dispose,idisposable,C#,Wcf,Dispose,Idisposable,这是该问题的后续问题: 在连接关闭后尝试重新打开与客户端的连接时,我还遇到了“无法访问已处理对象”异常。我是这样做的: try { if (!(client.State == CommunicationState.Opened) && !(client.State == CommunicationState.Opening)) { await Task.Run(() => client.Open()); } ... finally
try
{
if (!(client.State == CommunicationState.Opened) && !(client.State == CommunicationState.Opening))
{
await Task.Run(() => client.Open());
}
...
finally
{
client.Close();
}
重新输入代码时,会再次引发异常
链接问题中的公认答案表明:
1) 每次需要调用web服务时,执行类似于client=new WebServiceClient()
的操作
2) 在dispose
方法中实现IDisposable和dispose,只在那里关闭客户端,但这意味着保持连接始终打开
对于如何处理这种情况,是否有一个约定?在您的场景中,重新创建客户端是否是一个问题?那代码是CPU限制/内存限制吗?如果没有,请重新创建一个或多个线程调用的客户端。您最好不要重新使用处于故障状态的客户端,因为调用Close和Open不太可能清除所有错误条件。@但是每次都需要像这样重新创建客户端似乎很奇怪。。这就是它的用途?我不明白为什么关闭连接也会处理掉整个clientAn实体框架DataContext具有相同的使用指南,所以它不会显得奇怪或是一个例子。其中一个问题可能是WCF客户端太抽象了,它不能像网络处理那样正确地处理实际的操作系统资源,但我没有深入研究实现以验证或寻找该假设的证据。将我的实现限制为重新创建而不是重复使用从未导致我遇到无法解决的问题,或者无法找到解决方案。在您的场景中,重新创建客户端是一个问题吗?那代码是CPU限制/内存限制吗?如果没有,请重新创建一个或多个线程调用的客户端。您最好不要重新使用处于故障状态的客户端,因为调用Close和Open不太可能清除所有错误条件。@但是每次都需要像这样重新创建客户端似乎很奇怪。。这就是它的用途?我不明白为什么关闭连接也会处理掉整个clientAn实体框架DataContext具有相同的使用指南,所以它不会显得奇怪或是一个例子。其中一个问题可能是WCF客户端太抽象了,它不能像网络处理那样正确地处理实际的操作系统资源,但我没有深入研究实现以验证或寻找该假设的证据。限制我的实现进行重新创建而不是重复使用,从来没有让我遇到无法解决的问题,也没有让我模糊地找到解决方案。