Tag: 垃圾收集

.NET:我是否需要在异步下载时保留对WebClient的引用?

我在一段生产代码中使用以下方法: 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); } 我现在担心,在调用DownloadDataCompleted事件之前, WebClient实例被垃圾收集可能导致难以重现的错误:退出我的DownloadData()方法后,没有对WebClient对象的明显引用,因此可能会发生这种情况。 所以我的问题是:这可以实际发生吗? 我无法重现该问题,因此可能会发生一些内部事情阻止WebClient对象被垃圾收集(例如,对象可能在等待响应时在某处注册自己的全局对象)。 代码在.NET 2.0上运行,如果这有任何区别。

.NET中的垃圾收集(代)

我已经阅读了很多.NET性能文章,这些文章描述了Gen1,Gen2垃圾收集和几代人幸存的对象。 为什么对象能够在收集中存活? 什么是钉扎? 我如何了解更多相关信息?

清理事件处理程序引用的最佳做法是什么?

我常常发现自己编写的代码如下: if (Session != null) { Session.KillAllProcesses(); Session.AllUnitsReady -= Session_AllUnitsReady; Session.AllUnitsResultsPublished -= Session_AllUnitsResultsPublished; Session.UnitFailed -= Session_UnitFailed; Session.SomeUnitsFailed -= Session_SomeUnitsFailed; Session.UnitCheckedIn -= Session_UnitCheckedIn; UnattachListeners(); } 目的是清理我们在目标(会话)上注册的所有事件订阅,以便GC可以自由处理会话。 我与同事讨论了实现IDisposable的类,但他相信这些类应该像这样执行清理: /// /// Disposes the object /// public void Dispose() { SubmitRequested = null; //frees all references to the SubmitRequested Event } 是否有理由选择其中一个? 有没有更好的方法来解决这个问题? (除了各处的弱参考事件) 我真正希望看到的是一些类似于引发事件的安全调用模式:即安全和可重复。 每次我附加到活动时我都记得要做的事情,这样我就可以确保清理起来很容易。

垃圾收集器是否在.NET中的异步调用期间销毁暂时未引用的对象?

想象一下,我将在.NET中进行异步调用,即HttpWebRequest.BeginGetResponse,并且不会在更广泛的范围内引用HttpWebRequest对象。 垃圾收集器会破坏它并导致问题吗? 示例代码: using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create(“http://www.contoso.com”); var result = Request.BeginGetResponse(GetResponseCallback, null); } private void GetResponseCallback(IAsyncResult AsyncResult) { // Do Something.. } } 备用版本(请求作为AsyncState传递): using System; using System.Net; public class AsyncHttpWebRequest { void Main() { var Request = HttpWebRequest.Create(“http://www.contoso.com”); var result = Request.BeginGetResponse(GetResponseCallback, Request); […]

WeakReference是否可以提供良好的缓存?

我有一个缓存,它使用WeakReferences到缓存的对象,以便在内存压力的情况下自动从缓存中删除它们。 我的问题是缓存的对象在存储到缓存后很快就会被收集。 缓存在64位应用程序中运行,尽管有超过4gig的内存仍然可用,但所有缓存的对象都被收集(它们通常在那时存储在G2堆中)。 进程资源管理器显示没有手动引发的垃圾收集。 我可以采用哪些方法让对象更长寿?

是否有可能在C#中创建一个真正弱键的字典?

我正试图为C#确定一个真正的WeakKeyedDictionary的细节……但我遇到了困难。 我意识到这是一个非常重要的任务,但似乎无法声明WeakKeyedKeyValuePair (如果密钥可达,GC只跟随值引用)使得它看起来似乎不可能。 我看到两个主要问题: 到目前为止,我所看到的每个实现都没有在收集密钥后修剪值。 考虑一下 – 使用这样一个词典的主要原因之一是防止这些值被保留(不仅仅是键!),因为它们无法访问,但在这里它们被强引用指向。 是的,在词典中添加/删除足够多,它们最终会被替换,但如果你不这样做呢? 如果没有假设的WeakKeyedKeyValuePair (或者告诉GC只在密钥可达时标记值的其他方法),任何引用它的密钥的值都不会被收集。 存储任意值时,这是一个问题。 问题1可能以相当不理想/不熟练的方式解决:使用GC通知等待完整的GC完成,然后继续并在另一个线程中修剪字典。 这个我半熟。 但问题2让我难过。 我意识到这很容易被“所以不要这样做”所抵消,但它让我感到疑惑 – 这个问题甚至可以解决吗?

新的Thread()和垃圾收集

我有以下代码: new Thread(new ThreadStart(delegate() { while (true) { //something } })).Start(); 垃圾收集器可以在处于Running状态时完成此Thread实例吗?

我是否需要在孤立之前从对象中删除事件订阅?

如果我的软件有两个对象实例,其中一个订阅了另一个的事件。 我是否需要在他们成为孤儿之前取消订阅他们才能被垃圾收集器清理干净? 或者,为什么我应该清除事件关系还有其他原因吗? 如果订阅的对象是孤立但订阅者不是,或反过来怎么办?

.NET对象事件和dispose / GC

编辑:在Joel Coehoorns出色的答案之后,我明白我需要更具体,所以我修改了我的代码,使其更贴近我想要了解的事情…… 事件:据我所知,在后台,事件是EventHandlers又名代表的“集合”,将在事件引发时执行。 所以对我来说这意味着如果对象Y有事件E而对象X订阅了事件YE ,那么Y将引用X,因为Y必须执行位于X中的方法,这样就不能收集X ,并且我理解的事情。 //Creates reference to this (b) in aaEventHappened += new EventHandler(this.HandleEvent); 但这不是Joel Coehoorn所说的…… 但是,事件存在问题,有时人们喜欢将IDisposable与具有事件的类型一起使用。 问题是,当类型X订阅另一个类型Y中的事件时,X现在具有对Y的引用。该引用将阻止Y被收集。 我不明白X将如何引用Y ??? 我修改了一些我的例子来说明我的情况更接近: class Service //Let’s say it’s windows service that must be 24/7 online { A _a; void Start() { CustomNotificationSystem.OnEventRaised += new EventHandler(CustomNotificationSystemHandler) _a = new A(); B b1 = new B(_a); B […]

使用GC.Collect()是否正确; GC.WaitForPendingFinalizers();?

我已经开始查看项目中的一些代码,发现这样的事情: GC.Collect(); GC.WaitForPendingFinalizers(); 这些线通常出现在被设想在提高效率的理论基础上破坏对象的方法上。 我发表了这样的言论: 在每个对象的销毁上显式调用垃圾收集会降低性能,因为如果CLR性能绝对必要,则不考虑它。 按该顺序调用这些指令会导致每个对象仅在最终确定其他对象时被销毁。 因此,一个可以独立销毁的对象必须等待其他对象的破坏而没有必要。 它可以产生死锁(参见: 这个问题 ) 1,2和3都是真的吗? 你能提供一些支持你答案的参考资料吗? 虽然我几乎可以肯定我的言论,但我需要明确我的论点,以便向我的团队解释为什么这是一个问题。 这就是我要求确认和参考的原因。