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使用済みのすべてのリソースを破棄してクリーンアップします。http://msdn.microsoft.com/en-us/library/system.idisposable.aspxの状態:

このインターフェイスの主な用途は、管理されていないリソースを解放することです。

于 2013-01-30T20:39:14.033 に答える
0

IDisposableWCF サービス クラスに実装し、Disposeメソッド内のリソースをクリーンアップします。

WCF は、サービスの有効期間が終了すると (つまり、インスタンス化モードに応じて、呼び出しの終了またはセッションの終了)、サービスの各インスタンスで Dispose を呼び出します。または、シングルトン インスタンスを使用している場合は、有効期間を制御するため、適切なタイミングで Dispose を呼び出すことができます。

于 2013-01-30T20:35:37.157 に答える