Eliminación de objetos y recolección de basura antes de la activación del evento.
Alguien con quien estaba hablando trajo un código:
private void DownloadInformation(string id)
{
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(DownloadStringCompleted);
wc.DownloadStringAsync(new Uri("http://www.fake.com/" + id));
}
}
Lo anterior es una versión simplificada de esto:
(Tengo el permiso del autor para publicar la imagen).
Lo que me molesta de ese código es que se adjunta un controlador de eventos,DownloadStringAsync()
se llama y luego elusing
termina el bloque, que llamaDispose()
enWebClient
. ¿Hay algo que impidaWebClient
de ser eliminado porusing
e incluso la basura recolectada antes deDownloadStringAsync()
completando yDownloadStringCompleted
¿desencadenante de eventos?
Hay un nuevo método,DownloadStringTaskAsync()
, que creo utilizar junto conawait
:
private async Task DownloadInformation(string id)
{
using (WebClient wc = new WebClient())
{
wc.DownloadStringCompleted += DownloadStringCompleted;
await wc.DownloadStringTaskAsync(new Uri("http://www.fake.com/" + id));
}
}
Sin embargo, incluso entonces ... básicamente apostaría a que el evento se dispara y se llama al controlador antes deWebClient
se deshace.
¿Estoy malentendido el ciclo de vida deWebClient
en este escenario o es un diseño de código terrible?