Memory 佳能EDSDK ObjectEvent\u DirItemRequestTransfer

Memory 佳能EDSDK ObjectEvent\u DirItemRequestTransfer,memory,memory-leaks,edsdk,Memory,Memory Leaks,Edsdk,我的C#应用程序每3分钟拍摄一次图像,我每次都从EDSDK中获得预期的图像。我的问题是,应用程序的每次快照都会泄漏大约5MB的数据,我非常确定问题出在EDSDK上 代码: 行OnImageCaptured(图像)只是将图像发送到控制器,该控制器将来自相机的图像与另一个图像合并,然后在保存最终合并图像后处理这两个图像: private void ImageCaptured(Image originalImage) { Image watermark = null;

我的C#应用程序每3分钟拍摄一次图像,我每次都从EDSDK中获得预期的图像。我的问题是,应用程序的每次快照都会泄漏大约5MB的数据,我非常确定问题出在EDSDK上

代码:

行OnImageCaptured(图像)只是将图像发送到控制器,该控制器将来自相机的图像与另一个图像合并,然后在保存最终合并图像后处理这两个图像:

    private void ImageCaptured(Image originalImage)
    {
        Image watermark = null;

        //Merge images
        try
        {
            watermark = Image.FromFile(Settings.Default.ImageWatermarkFilename);
            _imageController.Merge(originalImage, watermark);
            _imageController.SaveImage(originalImage);
        }
        catch (Exception ex)
        {
            LogManager.Instance.UpdateLog(string.Format("Error - Failed to merge and save images. Exception: {0}.", ex.Message));

            //HACK:
            System.Windows.Forms.Application.Restart();
            App.Current.Shutdown(); 
        }
        finally
        {
            originalImage.Dispose();
            if (watermark != null)
                watermark.Dispose();
        }
    }
那么为什么应用程序内存会泄漏呢?有什么想法吗


/干杯

释放你的
GCHandle
。当你每次拍摄时,它都是吞噬记忆的罪魁祸首


gcHandle.Free()

更新:我解决了这个问题。。。我只需要调用gcHandle.Free()-非常简单。
    private void ImageCaptured(Image originalImage)
    {
        Image watermark = null;

        //Merge images
        try
        {
            watermark = Image.FromFile(Settings.Default.ImageWatermarkFilename);
            _imageController.Merge(originalImage, watermark);
            _imageController.SaveImage(originalImage);
        }
        catch (Exception ex)
        {
            LogManager.Instance.UpdateLog(string.Format("Error - Failed to merge and save images. Exception: {0}.", ex.Message));

            //HACK:
            System.Windows.Forms.Application.Restart();
            App.Current.Shutdown(); 
        }
        finally
        {
            originalImage.Dispose();
            if (watermark != null)
                watermark.Dispose();
        }
    }