【发布时间】:2020-09-14 20:38:14
【问题描述】:
我正在使用Avalonia UI 框架构建一个 dotnet core MVVM 应用程序。
我想显示来自 WebCam 的帧并创建了一个简单的 WebCamViewModel:
public class WebCamViewModel : ViewModelBase
{
private Bitmap webCamImage;
public Bitmap WebCamImage
{
get { return webCamImage; }
private set { this.RaiseAndSetIfChanged(ref webCamImage, value); }
}
public WebCamViewModel(WebCamImageService webcamImageService)
{
webcamImageService.OnFrame += BitmapReceived;
}
public void BitmapReceived(Bitmap bitmap)
{
WebCamImage = bitmap;
}
}
我尝试了 naiv 方法并像这样处理旧位图:
public void BitmapReceived(Bitmap bitmap)
{
if (webCamImage != null) webCamImage.Dispose();
WebCamImage = bitmap;
}
我得到 System.NullReferenceException:“对象引用未设置为对象的实例。”在调整应用程序大小时。 StackTrace
-
如何正确处理旧的位图实例,让 GC 不用做太多事情?
-
有没有更好的方法来显示动态变化的图像内容?
【问题讨论】:
-
您有潜在的内存泄漏 - 您没有取消订阅 OnFrame 事件。当不再需要对象时,使用 Dispose 接口进行处理。
-
BitMap作为属性公开。可以从该属性中读取什么?还有什么可能引用BitMap,如果它被处置,它会突然停止工作?为了安全地处理它,您必须知道还有什么对该对象的引用。 -
@ScottHannen 实际上此属性仅通过视图中的数据绑定使用
-
@eocron 感谢您指出这一点。我打算在整个应用程序生命周期中使用 OnFrame 事件。
-
位图应该在内部进行引用计数,因此只要您不再将处置的位图作为属性公开,处置面向用户的位图类就应该是安全的。你有那个异常的堆栈跟踪吗?
标签: c# bitmap dispose propertychanged avaloniaui