防止访问已处置的参考

时间:2010-11-08 20:54:56

标签: c# winforms

我有一个类似于PictureBox控件的图像显示控件,它需要一个Bitmap并显示它。问题是我的控件将天真地尝试执行操作,要求它访问它的图像字段,即使已经处理了提供的位图。所以,假设我有一个带有图像显示控件的表单。我已将Image属性设置为我从文件加载的图像,然后由于某种原因(无论为什么或如何)处理图像。然后我做了一些事情来重新绘制图像控件,当它试图访问现在处理的Bitmap时,它会左右抛出InvalidArgumentException。我理解这个问题,但对解决方案并非百分之百的信心。

我的图像显示控件无法控制是否通过调用代码处理图像引用,并且没有我知道检查对象是否被处置的公共方式。我可以想到两种可能的解决方案:

  1. 在我的图像控件中存储位图的副本(即Clone()提供的图像)然后,源图像会发生什么并不重要。我认为这是最好的解决方案。
  2. 包装我在try / catch语句中可以想到的一切 - 这是一个可怕的选择,我只是为了阻止其他人提出建议。
  3. 在我实施选项#1(我认为最有意义的选项)之前,我想我会问这里是否有最佳实践来处理这种情况。

2 个答案:

答案 0 :(得分:2)

当我在C#和WinForms中开发ImageViewer控件时,我遇到了完全相同的困境。事实上,处理图像的责任在于控制的客户端,而另一方面,在不合时宜的处理中出现错误会导致控件崩溃,这是不可接受的。

我使用了第一种方法 - 保留位图的本地/内部副本 - 除了内存使用外,它没有任何缺点。我相信这是更好的方法。

答案 1 :(得分:0)

如果要更改位图上的任何像素,则应始终克隆它并更改克隆版本。

除此之外,你的解决方案可能还不错。