通过导入过程添加图像时,在运行时处置处置

时间:2019-05-30 11:22:55

标签: c# winforms dispose

我有一个使用自定义按钮的应用程序。为此,我将单独的绘图类用于绘图。绘图类派生自IDisposable,我在其接口中调用了GC.SuppressFinalize(this)。一切正常,但是当我为按钮导入图像时,会调用dispose来处理导致无效异常的图像。

我们正在使用GC.SuppressFinalize(this)来处理我们的应用程序中使用的托管资源,我发现这是导致问题的原因。

这是用于复制的简单代码。

GraphQLParser: Unknown field 'isModalOpened' on type 'Query'.

当我拖放此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); } } 控件并尝试使用“导入”过程分配图像时,调用了dispose,该对象将处理绘制时导致异常的Image。

从“ System.Windows.Forms.UnsafeNativeMethod”中调用了Dispose。

有人可以提出问题或使用GC.SuppressFinalize()确实引起问题吗?

1 个答案:

答案 0 :(得分:0)

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

GC.SuppressFinalize()
此方法在obj的对象标头中设置一个位,运行时在调用终结器时检查该位。由Object.Finalize方法表示的终结器用于在垃圾回收对象之前释放不受管的资源。如果obj 没有终结器,则对SuppressFinalize方法的调用无效

另外,请查看有关实现Disposable的stackoverflow主题:Finalizer and IDisposable