Следует ли избавляться от ссылки WebResponse в WebException, если она вызвана из WebClient?

Связанный вопрос: WebClient в .Net не освобождение ресурсов сокета

При отладке проблемы с утечкой ресурсов я заметил, что System.Net.WebException (одноразовый тип) содержит ссылку на System.Net.WebResponse ( одноразового типа). Мне интересно, следует ли мне избавиться от этой ссылки при явной обработке WebResponse , как показано в следующем фрагменте.

using (WebClient client = new WebClient())
{
    WebException ex = Assert.Throws(() => client.OpenRead(myUri));
    Assert.That(
        ((HttpWebResponse)ex.Response).StatusCode,
        Is.EqualTo(HttpStatusCode.ServiceUnavailable));
}

Ссылка WebException.WebResponse является копией существующей ссылки в Веб-клиент . Я думал, что это будет удалено через WebClient. Dispose , но это не так, поскольку WebClient не отменяет защищенный базовый метод Component.Dispose (bool) . Фактически, дизассемблирование предполагает, что ресурс WebResponse никогда не удаляется, а устанавливается равным нулю, когда он больше не нужен.

public Stream OpenRead(Uri address)
{
    Stream stream2;

    // --- removed for brevity ---

    WebRequest request = null;
    this.ClearWebClientState();
    try
    {
        request = this.m_WebRequest = this.GetWebRequest(this.GetUri(address));
        Stream responseStream = (this.m_WebResponse = this.GetWebResponse(request)).GetResponseStream();

        // --- removed for brevity ---

        stream2 = responseStream;
    }
    catch (Exception exception)
    {

        // --- removed for brevity ---

        AbortRequest(request);
        throw exception;
    }
    finally
    {
        this.CompleteWebClientState();
    }
    return stream2;
}

... с ClearWebClientState () следующим образом:

private void ClearWebClientState()
{
    // --- removed for brevity ---

    this.m_WebResponse = null;
    this.m_WebRequest = null;
}

11
задан Community 23 May 2017 в 11:53
поделиться