Без помощи профилировщика или даже просмотра остальной части вашего кода, я почти гарантирую, что здесь «утечка»:
_frameImage.Source = LoadBitmap((System.Drawing.Bitmap)e.WebCamImage);
Этот метод, безусловно, вызывается очень быстро, и выне Dispose()
в вашем Bitmaps
.У GC не будет времени, чтобы привести себя в порядок после вас и вызывать финализатор на каждом Bitmap
, поэтому у вас заканчивается память.
Вам нужно позвонить Dispose()
на этот Bitmap
после того, как выс этим покончено.BitmapSource
в любом случае создает копию данных изображения, поэтому в этом нет необходимости.Я бы попробовал это:
private void webcam_ImageCaptured(object source, WebcamEventArgs e)
{
using( Bitmap b = e.WebCamImage )
{
_frameImage.Source = LoadBitmap((System.Drawing.Bitmap)e.WebCamImage);
}
}
Это, конечно, предполагает, что удаление растрового изображения внутри этого обработчика событий является допустимым (например, кто-нибудь еще обрабатывает это событие?). Возможно, вы захотите выставитьВместо этого BitmapSource
в классе WebCamEventArgs
, чтобы вы могли убедиться, что другие клиенты не полагаются на то, что Bitmap
остается действительным.
Это, конечно, если вы написали API, чтобы быть с.Если нет, вы можете написать оболочку, чтобы убедиться, что ваш код никогда не видит Bitmap
и работает только с типами изображений WPF.