فهرست منبع

Memory optimization: properly dispose canvas when connecting to the Companion App

Marcin Ziąbek 9 ماه پیش
والد
کامیت
d29c910de5
2فایلهای تغییر یافته به همراه15 افزوده شده و 2 حذف شده
  1. 14 1
      Source/QuestPDF/Drawing/CompanionCanvas.cs
  2. 1 1
      Source/QuestPDF/Drawing/DocumentGenerator.cs

+ 14 - 1
Source/QuestPDF/Drawing/CompanionCanvas.cs

@@ -36,7 +36,7 @@ namespace QuestPDF.Drawing
         public CompanionCommands.UpdateDocumentStructure.DocumentHierarchyElement Hierarchy { get; set; }
         public CompanionCommands.UpdateDocumentStructure.DocumentHierarchyElement Hierarchy { get; set; }
     }
     }
     
     
-    internal class CompanionCanvas : SkiaCanvasBase
+    internal class CompanionCanvas : SkiaCanvasBase, IDisposable
     {
     {
         private SkPictureRecorder? PictureRecorder { get; set; }
         private SkPictureRecorder? PictureRecorder { get; set; }
         private Size? CurrentPageSize { get; set; }
         private Size? CurrentPageSize { get; set; }
@@ -45,6 +45,19 @@ namespace QuestPDF.Drawing
         
         
         internal CompanionCommands.UpdateDocumentStructure.DocumentHierarchyElement Hierarchy { get; set; }
         internal CompanionCommands.UpdateDocumentStructure.DocumentHierarchyElement Hierarchy { get; set; }
         
         
+        ~CompanionCanvas()
+        {
+            Dispose();
+        }
+
+        public void Dispose()
+        {
+            Canvas?.Dispose();
+            PictureRecorder?.Dispose();
+            // do not dispose PageSnapshots, they are used by the CompanionDocumentSnapshot
+            GC.SuppressFinalize(this);
+        }
+        
         public override void BeginDocument()
         public override void BeginDocument()
         {
         {
             PageSnapshots.Clear();
             PageSnapshots.Clear();

+ 1 - 1
Source/QuestPDF/Drawing/DocumentGenerator.cs

@@ -89,7 +89,7 @@ namespace QuestPDF.Drawing
 
 
         internal static CompanionDocumentSnapshot GenerateCompanionContent(IDocument document)
         internal static CompanionDocumentSnapshot GenerateCompanionContent(IDocument document)
         {
         {
-            var canvas = new CompanionCanvas();
+            using var canvas = new CompanionCanvas();
             RenderDocument(canvas, document, DocumentSettings.Default);
             RenderDocument(canvas, document, DocumentSettings.Default);
             return canvas.GetContent();
             return canvas.GetContent();
         }
         }