Io uso il seguente metodo in un pezzo di codice di produzione:.NET: Devo mantenere un riferimento a WebClient durante il download in modo asincrono?
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);
}
Ora sono preoccupato che un disco per riprodurre bug potrebbe essere causato dal WebClient
esempio essere garbage collection prima dell'evento DownloadDataCompleted
si chiama: dopo l'uscita il mio metodo DownloadData()
, non ci sono riferimenti ovvi all'oggetto WebClient
, in modo che ciò possa avvenire in modo plausibile.
Quindi la mia domanda è: può accadere questo realisticamente? Non riesco a riprodurre il problema, quindi potrebbero esserci alcune cose interne che impediscono che l'oggetto WebClient
venga sottoposto a garbage collection (ad esempio, l'oggetto potrebbe registrarsi da qualche parte in un oggetto globale mentre attende la risposta).
Il codice è in esecuzione su .NET 2.0 se questo fa alcuna differenza.
Si è ovviamente corretto che la questione importante è se il delegato riceve la garbage collection. E sì, si dovrebbe pensare che il sistema di completamento dell'istruzione elettronica debba contenere un riferimento (indiretto) al delegato. Ma non sembra del tutto impossibile che questo riferimento possa essere un WeakReference. –
Sì, non impossibile. Ma vorrei * spero * che sarebbe documentato (come lo è per Timer). –