Связанный вопрос: 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;
}