我最近有很多annoying problems访问位图,我开始认为我需要重新评估应用程序的设计。
目前,我有一个对象可以创建另外两个对象。这些其中之一提供一系列位图(例如来自网络摄像头),另一个提供一系列坐标对(例如来自鼠标或触摸板)。父对象具有子对象生成的事件的侦听器。事件具有自定义参数,其携带新信息(位图或坐标)作为有效载荷。例如:
public class NewImageEventArgs : EventArgs
{
public NewImageEventArgs(Bitmap image)
{
Image = image;
}
public Bitmap Image { get; private set; }
}
父对象中的侦听器方法将有效内容复制到对象级表示。当触发任何一个侦听器(位图或坐标)时,它们随后调用一个共享方法,该方法使用位图和坐标进行一些计算。
private void PointerModule_NewPosition(object sender, NewPositionEventArgs e)
{
this.p = e.Position;
this.Invalidated();
}
在我看来,我的OutOfMemory和InvalidOperation(" Object目前正在其他地方使用")的反复出现的问题源于每个新事件可能在不同的线程上的事实。当在一个线程上使用位图时,当另一个线程试图同时访问它时会引发异常。
我是否需要从根本上改变程序的形状?我可以采取任何预防措施来消除这类问题吗?
答案 0 :(得分:0)
编辑: 我重读了你的问题,我可能回答了一个与你提出的问题略有不同的问题。然而,我在“对象在其他地方使用”的例外情况下遇到了同样的问题,我学到的教训总结在底部的链接中。 bitmap.Clone()和新的Bitmap(源)都不会创建深度图像副本。这导致例外。
在我的应用程序中,我使用模式:
public class ImageProvider()
{
public event EventHandler LiveImageUpdated;
private object _currentImageLock = new object();
private Bitmap _currentImage;
public Bitmap CurrentImage
{
get
{
lock (_currentImageLock)
{
return DeepImageCopy(_currentImage)
}
}
private set
{
lock(_currentImageLock)
{
_currentImage = value
}
if (LiveImageUpdated != null)
{
foreach (Delegate del in LiveImageUpdated.GetInvocationList())
{
EventHandler handler = (EventHandler)del;
handler.BeginInvoke(this, EventArgs.Empty, null, null);
}
}
}
}
}
我问了这个问题: How to create a Bitmap deep copy
应用程序没有问题。所以基本上我跳过了新的图像作为参数的部分,听众要求图像的深层复制,他们不共享图像。 Performancewise它没有问题。