我有一个使用自定义按钮的应用程序。为此,我将单独的绘图类用于绘图。绘图类派生自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()确实引起问题吗?
答案 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