2011-07-25 35 views
1

我的C#應用​​程序每3分鐘拍攝一張圖像,並且每次都按照預期從EDSDK獲取圖像。我的問題是,應用程序每次拍攝時泄漏大約5 MB,Iøm非常確定問題在於EDSDK。Canon EDSDK ObjectEvent_DirItemRequestTransfer

代碼:

private uint CameraObjectEvent(uint inEvent, IntPtr inRef, IntPtr inContext) 
    { 
     switch (inEvent) 
     { 
      case EDSDK.ObjectEvent_DirItemRequestTransfer: 
       GetCapturedItem(inRef); 
       break; 
     } 

     return EDSDKErrorCodes.EDS_ERR_OK; 
    } 

    private void GetCapturedItem(IntPtr directoryItem) 
    { 
     uint error = EDSDKErrorCodes.EDS_ERR_OK; 
     IntPtr stream = IntPtr.Zero; 

     //Get information of the directory item. 
     EDSDK.EdsDirectoryItemInfo dirItemInfo; 
     error = EDSDK.EdsGetDirectoryItemInfo(directoryItem, out dirItemInfo); 
     if (error != EDSDKErrorCodes.EDS_ERR_OK) 
     { 
      OnCameraErrorRaised(error, "EDSDK.EdsGetDirectoryItemInfo failed."); 
      return; 
     } 

     //Create a file stream for receiving image. 
     error = EDSDK.EdsCreateMemoryStream(dirItemInfo.Size, out stream); 
     if (error != EDSDKErrorCodes.EDS_ERR_OK) 
     { 
      OnCameraErrorRaised(error, "EDSDK.EdsCreateMemoryStream failed"); 
      return; 
     } 

     //Fill the stream with the resulting image 
     error = EDSDK.EdsDownload(directoryItem, dirItemInfo.Size, stream); 
     if (error != EDSDKErrorCodes.EDS_ERR_OK) 
     { 
      OnCameraErrorRaised(error, "EDSDK.EdsDownload failed."); 
      return; 
     } 

     error = EDSDK.EdsDownloadComplete(directoryItem); 
     if (error != EDSDKErrorCodes.EDS_ERR_OK) 
     { 
      OnCameraErrorRaised(error, "EDSDK.EdsDownloadComplete failed."); 
      return; 
     } 

     //Copy the stream to a byte[] 
     IntPtr pointerToBytes = IntPtr.Zero; 
     EDSDK.EdsGetPointer(stream, out pointerToBytes); 

     MemoryStream imageStream = null; 
     Image image = null; 

     try 
     { 
      byte[] buffer = new byte[dirItemInfo.Size]; 
      GCHandle gcHandle = GCHandle.Alloc(buffer, GCHandleType.Pinned); 
      Marshal.Copy(pointerToBytes, buffer, 0, (int)dirItemInfo.Size); 

      //Create a MemoryStream and return the image 
      imageStream = new MemoryStream(buffer); 
      image = Image.FromStream(imageStream); 
     } 
     catch (Exception ex) 
     { 
      OnCameraErrorRaised(999999, string.Format("Failed while retrieving image from camera. Exception: {0}.", ex.Message)); 
     } 
     finally 
     { 
      if (imageStream != null) 
       imageStream.Dispose(); 
     } 

     //If image was captured then send ImageCaptured event 
     if (image != null) 
      OnImageCaptured(image); 

     //Clean up 
     EDSDK.EdsRelease(pointerToBytes); 
     pointerToBytes = IntPtr.Zero; 

     EDSDK.EdsRelease(stream); 
     stream = IntPtr.Zero; 

     EDSDK.EdsRelease(directoryItem); 
     directoryItem = IntPtr.Zero; 
    } 

線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(); 
     } 
    } 

那麼,爲什麼應用程序內存泄漏 - 任何想法?

/歡呼聲

+0

更新:我解決了這個問題。我剛剛打電話給gcHandle.Free() - 很簡單的。 – Weed2k

回答

0

發佈您的GCHandle。它是罪魁禍首吃內存每次當你正在拍攝

gcHandle.Free()