CA2000和WCF客户端的处置

时间:2011-03-09 16:07:24

标签: c# .net wcf code-analysis idisposable

有大量有关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隐藏此警告一旦我感到满意,我正在尽一切可能确保客户端被处理掉?

我找到的相关资源:

1 个答案:

答案 0 :(得分:1)

您可以在致电Dispose后,在finally区块中为CloseProxy添加电话。那时候你可以合理地确定Dispose不会抛出,虽然添加多余的代码只是来保持代码分析很开心似乎有点傻 - 我可能只是压制了消息。

(无论您选择哪个选项,都要包含非常明确的注释,解释代码执行操作的原因。)