我对清理ServiceHost的最佳方法感到有些困惑。我在代码中发现了问题,因为Visual Studio代码分析器发出了CA1001警告,建议我为我的类实现IDisposable接口。
我已经阅读了关于IDisposable的讨论并熟悉了典型的用例,但在这个例子中发现自己很困惑。确保ServiceHost正在处理并可能满足CA1001的正确方法是什么。感谢。
我的代码如下所示:
public class MyClass
{
private ServiceHost host = null;
public void StartListening(...)
{
// make sure we are not already listening for connections
if (host != null && host.State != CommunicationState.Closed)
StopListening();
// create service host instance
host = new ServiceHostWithData(typeof(ServiceHandler), address);
// do a bunch of configuration stuff on the host
host.Open();
}
public void StopListening()
{
// if we are not closed
if ((host != null) && (host.State != CommunicationState.Closed))
{
host.Close();
host = null;
}
else // we are null or closed
{
host = null; // if it isn't null, and it is already closed, then we set it to null
}
}
}
public class MyClass
{
private ServiceHost host = null;
public void StartListening(...)
{
// make sure we are not already listening for connections
if (host != null && host.State != CommunicationState.Closed)
StopListening();
// create service host instance
host = new ServiceHostWithData(typeof(ServiceHandler), address);
// do a bunch of configuration stuff on the host
host.Open();
}
public void StopListening()
{
// if we are not closed
if ((host != null) && (host.State != CommunicationState.Closed))
{
host.Close();
host = null;
}
else // we are null or closed
{
host = null; // if it isn't null, and it is already closed, then we set it to null
}
}
}
答案 0 :(得分:5)
您的班级应该实施IDisposable。基于该MSDN页面的示例:
public class MyClass : IDisposable
{
private bool disposed = false;
private ServiceHost host = null;
public void StartListening(...)
{
// ....
}
public void StopListening()
{
// ...
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if(!this.disposed)
{
if(disposing)
{
this.StopListening();
}
disposed = true;
}
}
~MyClass()
{
Dispose(false);
}
}