2

我有一个托管在 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;
        }
    }
}
4

2 回答 2

0

在你的 IDisposable 中实现MyWCFService,在 dispose 清理所有使用的资源。http://msdn.microsoft.com/en-us/library/system.idisposable.aspx指出:

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

于 2013-01-30T20:39:14.033 回答
0

在您的 WCF 服务类中实现,并在方法IDisposable中清理资源。Dispose

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

于 2013-01-30T20:35:37.157 回答