相关疑难解决方法(0)

正确实现IDisposable

在我的类中,我实现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 c# garbage-collection memory-leaks memory-management

132
推荐指数
6
解决办法
10万
查看次数

.net终结器总是被执行吗?

终结器是否保证在某些时候在.NET中执行(备用断电等)?我知道GC是如何工作的,并且当它们完全运行时它是不确定的.

(搜索没有显示出良好的答案,所以我加入了这个问题,期望与不那么容易发现的实际答案合并.除此之外,我已经知道了答案,我将要添加几天之后如果没有人提到它.)

.net garbage-collection finalizer

18
推荐指数
2
解决办法
1783
查看次数

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

在回答关于SO的另一个问题*以及随后的评论讨论时,我遇到了一个我不清楚的问题.

在我误入歧途的任何地方纠正我......

当垃圾收集器收集一个对象时,它会在一个单独的线程上调用该对象的终结器(除非终结器已经被抑制,例如通过一个Dispose()方法).在收集时,GC会挂起除触发集合的线程(除了背景集合)之外的所有线程.

不清楚的是:

  1. 在收集垃圾收集器之前,垃圾收集器是否等待终结器在该对象上执行?
  2. 如果没有,它是否在终结器仍在执行时取消挂起线程?
  3. 如果它确实等待,如果终结器遇到其中一个被挂起的线程所持有的锁,会发生什么?终结器线程是否会死锁?(在我的回答中,我认为这是糟糕的设计,但我可能会看到可能发生这种情况的情况)

*链接到原始问题:
.NET GC从终结器访问同步对象

c# garbage-collection finalizer

12
推荐指数
1
解决办法
7600
查看次数

GC.WaitForPendingFinalizers 之后未调用终结器

我读到了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)

c# events garbage-collection

3
推荐指数
1
解决办法
972
查看次数

处理工作正常,但不是终止

我有一个实现的类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)

c# gdi+

0
推荐指数
1
解决办法
113
查看次数