Tag: finalizer

为什么c#垃圾收集器在满足请求之前不会继续尝试释放内存?

考虑以下代码: using System; namespace memoryEater { internal class Program { private static void Main(string[] args) { Console.WriteLine(“alloc 1”); var big1 = new BigObject(); Console.WriteLine(“alloc 2”); var big2 = new BigObject(); Console.WriteLine(“null 1”); big1 = null; //GC.Collect(); Console.WriteLine(“alloc3”); big1 = new BigObject(); Console.WriteLine(“done”); Console.Read(); } } public class BigObject { private const uint OneMeg = 1024 […]

我可以重写Dispose来创建一个总是调用SaveChanges的实体类吗?

这是一个相当好的观点,我希望答案是“开始时并不是一个好主意” – 也就是说,如果某人有点放纵,它有一个我感兴趣的点。 型号代码: public partial class MyEntities : ObjectContext { // the idea is if the object is in a using block, this always gets called? protected override void Dispose(bool disposing) { this.SaveChanges(); base.Dispose(disposing); } } 客户代码: using(var model = new MyEntities()) { // do something // no worry about calling model.SaveChanges() } 我不确定的问题是: […]

.NET – 终结器和退出(0)

我有一个.NET C#/ C ++应用程序,它使用一个线程中的exit(0) (来自 )来终止。 奇怪的是,在某些情况下,托管对象的终结器在调用exit后立即被调用,而在其他情况下,它们根本不被调用。 这种情况非常确定 – 应用程序在其生命周期内从外部插件dll(用非托管C编写)调用一些方法。 如果我使用dll A,则始终调用终结器。 如果我使用dll B,则永远不会调用终结器。 在退出(0)调用的情况下,终结器的预期行为是什么? (如果有任何预期的和记录在案的行为) 对外部dll的调用是否会改变一些可能影响进程终止方式的全局设置?

在C#中使用Finalizer的好样本

当我在C#中阅读一些关于内存管理的文章时,我对Finalizer方法感到困惑。 有许多与之相关的复杂规则。 例如,没有人知道终结器何时被调用,即使ctor中的代码抛出,他们也会调用,CLR不保证在程序关闭时调用所有终结器等。 对于什么终结器可以在现实生活中使用? 我发现的唯一一个例子是程序在GC启动时发出蜂鸣声。 您是否在代码中使用了Finalizer并且可能有一些好样本? UPD: 当开发人员想要确保某些类始终通过IDisposable正确处理时,可以使用终结器。 ( 链接 ;感谢Steve Townsend )

C ++ / CLI:防止非托管资源的托管包装上的垃圾回收

我有一个需要在C#中使用的C ++非托管类NativeDog ,所以我创建了一个包装类ManagedDog 。 // unmanaged C++ class class NativeDog { NativeDog(…); // constructor ~NativeDog(); // destructor … } // C++/CLI wrapper class ref class ManagedDog { NativeDog* innerObject; // unmanaged, but private, won’t be seen from C# ManagedDog(…) { innerObject = new NativeDog(…); … } ~ManagedDog() // destructor (like Dispose() in C#) { // […]

c#finalizer抛出exception?

从MSDN引用: 如果Finalize或Finalize的覆盖引发exception,则运行时将忽略该exception,终止该Finalize方法,并继续完成最终化过程。 但如果我有: ~Person() { throw new Exception(“meh”); } 然后它会导致运行时exception? ps我知道这绝不会发生,但我只是对这种行为感到好奇。 我们的一个客户有一个空的尝试捕获他们的所有终结器..它甚至没有记录出错或重新对象:/

终结器和处理

我有一个名为BackgroundWorker的类,它有一个不断运行的线程。 要关闭此线程,名为stop to的实例变量必须为true 。 为了确保在使用完类时释放线程,我添加了IDisposable和一个调用Dispose()的终结器。 假设stop = true确实导致此线程退出,这个sippet是否正确? 可以从终结器中调用Dispose ,对吗? 如果objectinheritance了IDisposable ,终结器应该总是调用Dispose ,对吧? /// /// Force the background thread to exit. /// public void Dispose() { lock (this.locker) { this.stop = true; } } ~BackgroundWorker() { this.Dispose(); }

为什么“Finalize方法不应该引用任何其他对象”?

我一直在思考为什么建议我们不要在finalize中释放托管资源。 如果您在http://msdn.microsoft.com/en-us/library/system.gc.suppressfinalize.aspx上看到代码示例,并搜索字符串“Dispose(bool disposing)在两个不同的场景中执行”并阅读评论,你会明白我的意思。 我能想到的唯一可能性是它可能与以下事实有关:无法预测终结器何时被调用。 有谁知道正确的答案? 谢谢,误导

垃圾收集和终结器:更好的点

在回答关于SO的另一个问题*以及随后的评论讨论时,我遇到了一个我不清楚的问题。 在我误入歧途的任何地方纠正我…… 当垃圾收集器收集一个对象时,它会在一个单独的线程上调用该对象的终结器(除非终结器已被抑制,例如通过Dispose()方法)。 在收集时,GC会挂起除触发收集的线程(除了背景集合)之外的所有线程。 不清楚的是: 在收集垃圾收集器之前,垃圾收集器是否等待终结器在该对象上执行? 如果没有,它是否在终结器仍在执行时取消挂起线程? 如果它确实等待,如果终结器遇到其中一个被挂起的线程所持有的锁,会发生什么? 终结器线程是否会死锁? (在我的回答中,我认为这是糟糕的设计,但我可能会看到可能发生这种情况的情况) *链接到原始问题: .NET GC从终结器访问同步对象

为什么结构不能有析构函数?

你认为对这个问题的采访最好的答案是什么? 我想我在这里找不到这个副本,如果有的话请链接。