uso el siguiente método en un trozo de código de producción:.NET: ¿Debo mantener una referencia a WebClient mientras descargo de forma asincrónica?
private void DownloadData(Uri uri)
{
WebClient webClient = new WebClient();
DownloadDataCompletedEventHandler eh = null;
eh = delegate(object sender, DownloadDataCompletedEventArgs e)
{
webClient.DownloadDataCompleted -= eh;
((IDisposable) webClient).Dispose();
OnDataDownloaded();
};
webClient.DownloadDataCompleted += eh;
webClient.DownloadDataAsync(uri);
}
Ahora estoy preocupado de que un disco para reproducir fallo podría ser causada por el WebClient
ejemplo ser basura recogida antes del evento DownloadDataCompleted
se llama: después de salir mi método DownloadData()
, no hay referencias obvias al objeto WebClient
, por lo que podría ocurrir de manera plausible.
Entonces mi pregunta es: ¿puede esto ocurrir de manera realista? No puedo reproducir el problema, por lo que puede haber algunas cosas internas que impidan que el objeto WebClient
sea recolectado como basura (por ejemplo, el objeto puede registrarse con un objeto global en algún lugar mientras espera la respuesta).
El código se está ejecutando en .NET 2.0 si eso hace la diferencia.
Está por supuesto correcto que la pregunta importante es si el delegado obtiene la basura recolectada. Y sí, uno debería pensar que el sistema de finalización de IO debe contener una referencia (indirecta) al delegado. Pero no parece completamente imposible que esta referencia sea una WeakReference. –
Sí, no es imposible. Pero espero * que sea documentado (como lo es para Timer). –