2

ObjectDisposedException約 50% の確率で がスローされるという問題に遭遇しました。try以下の( 内の) 内のコードfinallyは、例外を引き起こしています。これを処理する方法がわかりません。以下に示すように例外を食べることもできますが、例外が発生することなくオブジェクトをチェックして閉じる方法はありますか?

    public static FindResponse Discover(FindCriteria findCriteria, 
                                        DiscoveryEndpoint discoveryEndpoint = null)
    {
        DiscoveryClient discoveryClient = null;

        try
        {
            if (discoveryEndpoint == null) { 
                 discoveryEndpoint = new UdpDiscoveryEndpoint(); 
            }

            discoveryClient = new DiscoveryClient(discoveryEndpoint);

            return discoveryClient.Find(findCriteria);
        }
        finally
        {
            try
            {
                if (discoveryClient != null)
                {
                    discoveryClient.Close();
                }
            }
            catch (ObjectDisposedException)
            {
                // Eat it.
            }
        }
    }
4

3 に答える 3

2

どうですか

public static FindResponse Discover(FindCriteria findCriteria, DiscoveryEndpoint discoveryEndpoint = null)
{
    if (discoveryEndpoint == null) 
      discoveryEndpoint = new UdpDiscoveryEndpoint();

    using (var client = new DiscoveryClient(discoveryEndpoint))
    {
        return client.Find(findCriteria);
    }
}

アップデート

例外DiscoveryClient.Dispose()をスローするようです。OPの元のアプローチは、唯一の受け入れられる答えのようです。

于 2015-02-05T06:55:27.893 に答える
-1

また、IDisposable オブジェクトには「using」を使用することをお勧めします。DiscoveryClient が IDisposable であることを考慮すると、

public static FindResponse Discover(FindCriteria findCriteria, DiscoveryEndpoint discoveryEndpoint = null)
    {

        FindResponse response = null;
        try
        {
            if (discoveryEndpoint == null) { discoveryEndpoint = new UdpDiscoveryEndpoint(); }

            using (DiscoveryClient discoveryClient = new DiscoveryClient(discoveryEndpoint))
            {
                response = discoveryClient.Find(findCriteria);
                discoveryClient.Close();
            }
        }
        finally
        {   
            // other finalizing works, like clearing lists, dictionaries etc.
        }
        return response;
    }
于 2015-02-05T06:58:41.297 に答える