在我的类中,我实现IDisposable如下:
public class User : IDisposable
{
public int id { get; protected set; }
public string name { get; protected set; }
public string pass { get; protected set; }
public User(int UserID)
{
id = UserID;
}
public User(string Username, string Password)
{
name = Username;
pass = Password;
}
// Other functions go here...
public void Dispose()
{
// Clear all property values that maybe have been set
// when the class was instantiated
id = 0; …Run Code Online (Sandbox Code Playgroud) 终结器是否保证在某些时候在.NET中执行(备用断电等)?我知道GC是如何工作的,并且当它们完全运行时它是不确定的.
(搜索没有显示出良好的答案,所以我加入了这个问题,期望与不那么容易发现的实际答案合并.除此之外,我已经知道了答案,我将要添加几天之后如果没有人提到它.)
在回答关于SO的另一个问题*以及随后的评论讨论时,我遇到了一个我不清楚的问题.
在我误入歧途的任何地方纠正我......
当垃圾收集器收集一个对象时,它会在一个单独的线程上调用该对象的终结器(除非终结器已经被抑制,例如通过一个Dispose()方法).在收集时,GC会挂起除触发集合的线程(除了背景集合)之外的所有线程.
不清楚的是:
*链接到原始问题:
.NET GC从终结器访问同步对象
我读到了Eric Lippert 的精彩解释,内容是关于当一个对象通过事件引用另一个对象时,何时会被垃圾收集。
为了证明埃里克所说的,我尝试了这段代码:
using System;
public class Program
{
public static void Main()
{
{
var myClass = new GCClass();
LongLivingClass.MyEvent += myClass.HandleEvent;
} // LongLivingClass holds a reference to myClass
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// expect: finalizer of GCLass not run
{
var myClass = new GCClass();
myClass.MyEvent += LongLivingClass.HandleEvent;
} // myClass can easily be GCed here
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
// expect: finalizer should run
Console.WriteLine("Finish");
}
}
class GCClass
{
public event EventHandler MyEvent;
public …Run Code Online (Sandbox Code Playgroud) 我有一个实现的类IDisposable,因为它使用Bitmap来自GDI +的图像资源(类).我用它来包装所有那些花哨的LockBits/ UnlockBits.它工作正常,无论是我打电话Dispose()还是using声明.
但是,如果我让程序在没有处理的情况下终止,我会得到一个System.AccessViolationException.直观地说,我认为GC将以Dispose与我相同的方式调用,并且该对象将优雅地释放资源,但这不是发生的事情.为什么?
这是IDisposable代码:
private bool _disposing = false;
~QuickBitmap() {
Dispose(false);
}
public void Dispose() {
Dispose(true);
GC.SuppressFinalize(this);
}
private void Dispose(bool safeDispose) {
if (_disposing)
return;
SaveBits(); // private wrapper to UnlockBits
bytes = null; // byte[] of the image
bmpData = null; // BitmapData object
if (safeDispose && bm != null) {
bm.Dispose(); // Bitmap object
bm = null; …Run Code Online (Sandbox Code Playgroud)