我在Windows服务中托管了WCF服务。 WCF服务有一个线程,它与外部系统建立UdpClient连接。我发现当Windows服务停止时,线程并不总是正常关闭并调用UdpClient.Close()方法,该方法将该连接打开(或我认为是套接字)。然后,当我再次运行它时,它会阻塞并且UdpClient永远不会接收广播的数据包。我想我的问题是,当Windows服务停止时,我不会调用UdpClient.Close。所以我的问题是如何正确释放这些资源?这是我的Windows服务的代码。
public class MyWindowsService : ServiceBase
{
public ServiceHost serviceHost = null;
public MyWindowsService()
{
ServiceName = "MyWindowsService";
}
public static void Main()
{
ServiceBase.Run(new MyWindowsService());
}
protected override void OnStart(string[] args)
{
if(serviceHost != null)
{serviceHost.Close();}
serviceHost = new ServiceHost(typeof(MyWCFService));
serviceHost.Open();
}
protected override void OnStop()
{
if(serviceHost != null)
{
//Need to release unmanaged resources in the
//WCF service here. How would I reference my
//WCF service and send it a message to stop the threads?
serviceHost.Close();
serviceHost = null;
}
}
}
答案 0 :(得分:0)
在WCF服务类中实施IDisposable
,并使用Dispose
方法清理资源。
WCF将在其生命周期结束时(即根据实例化模式结束通话或会话结束)对服务的每个实例调用Dispose。或者,如果您使用的是单例实例,则可以控制生命周期,因此您可以在适当的时间调用Dispose
答案 1 :(得分:0)
在MyWCFService
中实施IDisposable,处理清理所有使用过的资源。 http://msdn.microsoft.com/en-us/library/system.idisposable.aspx州:
此接口的主要用途是释放非托管资源。