有大量有关WCF客户端的信息,以及您不能简单地依赖using语句来处理客户端这一事实。这是因为Close方法可以抛出异常(即,如果托管服务的服务器没有响应)。
我已尽最大努力实施符合众多建议的内容。
public void DoSomething()
{
MyServiceClient client = new MyServiceClient(); // from service reference
try
{
client.DoSomething();
}
finally
{
client.CloseProxy();
}
}
public static void CloseProxy(this ICommunicationObject proxy)
{
if (proxy == null)
return;
try
{
if (proxy.State != CommunicationState.Closed
&& proxy.State != CommunicationState.Faulted)
{
proxy.Close();
}
else
{
proxy.Abort();
}
}
catch (CommunicationException)
{
proxy.Abort();
}
catch (TimeoutException)
{
proxy.Abort();
}
catch
{
proxy.Abort();
throw;
}
}
这似乎按预期工作。但是,当我在Visual Studio 2010中运行代码分析时,仍然会收到CA2000警告。
CA2000:Microsoft.Reliability:In 方法'DoSomething()',调用 System.IDisposable.Dispose on object 在所有引用之前'客户' 超出范围。
我可以对我的代码做些什么来摆脱警告,或者我应该使用SuppressMessage隐藏此警告一旦我感到满意,我正在尽一切可能确保客户端被处理掉?
我找到的相关资源:
答案 0 :(得分:1)
您可以在致电Dispose
后,在finally
区块中为CloseProxy
添加电话。那时候你可以合理地确定Dispose
不会抛出,虽然添加多余的代码只是来保持代码分析很开心似乎有点傻 - 我可能只是压制了消息。
(无论您选择哪个选项,都要包含非常明确的注释,解释代码执行操作的原因。)