Я заметил, что моя программа текла память. Поэтому я использовал dotMemory, чтобы найти утечку, и похоже, что это функция вызывает утечку:Утечка памяти при Marshal.Copy
private void LoadBits()
{
// Lock the bitmap's bits.
Rectangle rect = new Rectangle(0, 0, bm.Width, bm.Height);
bmpData = bm.LockBits(rect, System.Drawing.Imaging.ImageLockMode.ReadWrite, bm.PixelFormat);
stride = bmpData.Stride;
// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;
// Declare an array to hold the bytes of the bitmap.
byteCount = Math.Abs(bmpData.Stride) * bm.Height;
bytes = new byte[byteCount];
// Copy the RGB values into the array.
System.Runtime.InteropServices.Marshal.Copy(ptr, bytes, 0, byteCount);
}
И это, как разблокировать биты.
private void SaveBits()
{
// Update Stuff
IntPtr ptr = bmpData.Scan0;
System.Runtime.InteropServices.Marshal.Copy(bytes, 0, ptr, byteCount);
bm.UnlockBits(bmpData);
}
Я реализовал интерфейс IDisposable для этого класса. И я называю SaveBits там, поэтому, даже если я забыл позвонить SaveBits, GC должен сделать это для меня. И да, я вызываю bm.Dispose() и устанавливаю все значение null в методе Dispose.
LoadBits и SaveBits используют разные переменные. один - '_bm', другой -' bm', вы могли бы разблокировать биты на неправильном объекте? Также можно было бы вызывать 'LoadBits()' более одного раза, прежде чем вызывается 'SaveBits()', что также приведет к утечке памяти. Попытайтесь положить 'bmpData = null' в конец' SaveBits() 'и поместить' if (bmpData! = Null) бросить новый InvalidOperationException(); 'в начале' LoadBits() 'и посмотреть, будет ли выбрано исключение. –
Я реорганизовал после того, как я разместил вопрос. Таким образом, «LoadBits» показывал старые имена var. Позвольте мне обновить его. – Trauer
Если вы делаете нулевую проверку и выдаете исключение, не бросает ли она? –