Disposição de objetos e coleta de lixo antes do acionamento do evento

Um pedaço de código foi trazido por alguém com quem eu estava conversando:

private void DownloadInformation(string id)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadStringCompleted += 
            new DownloadStringCompletedEventHandler(DownloadStringCompleted);
        wc.DownloadStringAsync(new Uri("http://www.fake.com/" + id));
    }
}

O acima é uma versão simplificada disso:

(Eu tenho a permissão do autor para postar a imagem.)

O que me incomoda nesse código é que um manipulador de eventos está anexado,DownloadStringAsync() é chamado e então ousing bloco termina, o que chamaDispose() emWebClient. Existe algo que irá impedirWebClient de ser descartado porusing e até lixo coletado antes deDownloadStringAsync() completando eDownloadStringCompleted evento acionado?

Existe um método mais novo,DownloadStringTaskAsync(), que eu pensaria usar em conjunto comawait:

private async Task DownloadInformation(string id)
{
    using (WebClient wc = new WebClient())
    {
        wc.DownloadStringCompleted += DownloadStringCompleted;
        await wc.DownloadStringTaskAsync(new Uri("http://www.fake.com/" + id));
    }
}

No entanto, mesmo assim ... eu basicamente apostaria que os gatilhos e manipulador de eventos são chamados antes doWebClient é descartado.

Estou entendendo mal o ciclo de vida deWebClient nesse cenário ou é um design de código terrível?

questionAnswers(2)

yourAnswerToTheQuestion