如何在Windows服务中托管的WCF服务中释放非托管资源?

时间:2013-01-30 15:13:07

标签: wcf c#-4.0 windows-services udpclient

我在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;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

在WCF服务类中实施IDisposable,并使用Dispose方法清理资源。

WCF将在其生命周期结束时(即根据实例化模式结束通话或会话结束)对服务的每个实例调用Dispose。或者,如果您使用的是单例实例,则可以控制生命周期,因此您可以在适当的时间调用Dispose

答案 1 :(得分:0)

MyWCFService中实施IDisposable,处理清理所有使用过的资源。 http://msdn.microsoft.com/en-us/library/system.idisposable.aspx州:

  

此接口的主要用途是释放非托管资源。