.NET:异步下载时是否需要保留对WebClient的引用?我在一段生产代码中使用了以下方法:privatevoidDownloadData(Uriuri){WebClientwebClient=newWebClient();DownloadDataCompletedEventHandlereh=null;eh=delegate(objectsender,DownloadDataCompletedEventArgse){webClient.DownloadDataCompleted-=eh;((IDisposable)webClient).Dispose();OnDataDownloaded();};webClient.DownloadDataCompleted+=嗯;webClient.DownloadDataAsync(uri);我现在担心WebClient实例在调用DownloadDataCompleted事件之前被垃圾收集可能会导致难以重新-我发现的错误:退出我的DownloadData()方法后,没有对WebClient对象的明显引用,所以这可能正在发生。所以我的问题是:这真的会发生吗?我无法重现该问题,因此内部可能发生了一些事情,阻止了WebClient对象被垃圾收集(例如,该对象可能在等待响应时将自己注册到全局对象的某个地方)。代码在.NET2.0上运行,如果有任何区别的话。不,您的对象在回调完成之前不会被GC编辑。根据垃圾收集器,.NET中的异步调用期间是否销毁了临时未引用的对象?,“异步API保留对您的请求的引用(在提交异步IO操作的线程池中),因此它在完成之前不会被垃圾回收。”但是,您的代码也在做它不需要的事情:您不需要分离事件处理程序,也不需要在Web客户端上调用Dispose。(Dispose()实际上并不是由WebClient实现的——您可以在http://referencesource.microsoft.com/netframework.aspx的.NETFramework参考源中看到这一点。因此您实际上不需要WebClient实例在.中引用。换句话说,下面的代码也可以正常工作,并避免从委托中引用外部局部变量的任何潜在问题(如上所述)。privatevoidDownloadData(Uriuri){DownloadDataCompletedEventHandlereh=null;eh=delegate(objectsender,DownloadDataCompletedEventArgse){OnDataDownloaded();};webClient.DownloadDataCompleted+=eh;webClient.DownloadDataAsync(uri);}不管怎样,你可能想在别处寻找你的错误来源。我见过的一个地方是HTTP调用的结果——你可能会用完内存,你可能会遇到服务器错误,等等。你可以查看e.Error以查看调用是否真的有效。虽然异步操作正在进行中,我不确定WebClients通常是否可以被垃圾收集,因为可能有内部引用——但更大的问题是:这重要吗?只要有足够的WebClient保持“活动”状态来为请求提供服务并调用您的处理程序,主要WebClient对象本身是否被垃圾收集是否重要?WebClient文档没有说明必须保留引用(例如,与System.Threading.Timer文档不同),因此我认为可以合理地假设这没问题。在这种特殊情况下,您的委托有一个对WebClient的引用,因此只要它引用委托本身,WebClient就不能。我有根据的猜测是,当网络流量到达时,系统的某些部分需要回调以知道该做什么,并且该回调最终(间接)导致您的委托,所以您没事。您可以尝试使用Windows调试工具调试您的应用程序-它可以让您准确地看到是什么保留了对特定对象的引用(使用相应的插件)。对于这种情况非常有用。但是,我不知道你的问题的答案。一种可能性是,在操作期间,WebClient使自己成为“根”对象之一,这些对象永远不会被垃圾收集(.NET应用程序通常有大约5到10个这样的对象,并且它们是少数使用的引用根的对象通过应用树)。然而,这纯粹是猜测。抛硬币...如果您在某处存储对WebClient的引用只是为了查看它是否有所作为...这会使问题完全消失吗?以这种方式检查并确保它看起来合乎逻辑可能比猜测更容易。创建一个引用范围变量(在您的情况下为webClient)的匿名方法,并使用对该对象的引用使其成为自己的变量。因此,当jon猜测您的委托将持有对webClient的引用时,webClient无法被垃圾回收,直到委托自行注销。但我通常建议不要在委托方法中使用webClient引用,而是将发送者强制转换为内部变量。在匿名方法之外使用变量会导致一些非常奇怪的错误。以上是C#学习教程:.NET:DoIneedIneedtokeepareferencetoWebClientwhendownloadingasynchronous?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
