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?

Respuestas a la pregunta(2)

Su respuesta a la pregunta