Уничтожение вызывается во время выполнения, когда изображение добавляется через процесс импорта - PullRequest
0 голосов
/ 30 мая 2019

У меня есть приложение, в котором я использую пользовательскую кнопку. Для этого я использую отдельный класс рисования для рисования. Класс рисования был получен из IDisposable, и я вызвал GC.SuppressFinalize (this) в его интерфейсе. Все работает нормально, но когда я импортирую изображение для кнопки, вызывается утилизация, которая удаляет мое изображение, что приводит к недопустимому исключению.

Мы используем GC.SuppressFinalize (this) для удаления управляемых ресурсов, используемых в нашем приложении, и я обнаружил, что это вызывает проблему.

Это простой код для репликации.

public class Custom : Control 
{
    private DrawingClass drawingClass;
    public Custom()
    {
        this.drawingClass = new DrawingClass();
    }

    protected override void OnPaint(PaintEventArgs e)
    {
        base.OnPaint(e);
        if(Image != null)
        e.Graphics.DrawImage(Image, this.ClientRectangle.Location);
    }

    protected override void Dispose(bool disposing)
    {
        base.Dispose(disposing);

        if (disposing)
        {
            Image.Dispose();
        }
    }

    public Image Image { get; set; }
}

public class DrawingClass : IDisposable
{
    public void Dispose()
    {
        GC.SuppressFinalize(this);
    }
}

Когда я перетаскиваю этот элемент управления Custom и пытаюсь назначить изображение, используя процесс импорта, вызывается утилизация, которая удаляет изображение, ведущее исключение которого при рисовании.

Утилизация была вызвана из «System.Windows.Forms.UnsafeNativeMethod».

Может кто-нибудь подсказать, что не так или использование GC.SuppressFinalize () действительно вызывает проблемы?

1 Ответ

0 голосов
/ 30 мая 2019

С https://docs.microsoft.com/en-us/dotnet/api/system.gc.suppressfinalize:

GC.SuppressFinalize ()
Этот метод устанавливает бит в заголовке объекта obj, который среда выполнения проверяет при вызове финализаторов. Финализатор, представленный методом Object.Finalize, используется для освобождения неуправляемых ресурсов перед сборкой мусора. Если obj не имеет финализатора , вызов метода SuppressFinalize не имеет эффекта .

Кроме того, ознакомьтесь с этим разделом, посвященным стеку, по реализации Disposable: Финализатор и IDisposable

...