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?