Browse Source

Previewer: stop debugging session when previewer is closed

MarcinZiabek 3 years ago
parent
commit
fba71e6392
2 changed files with 29 additions and 6 deletions
  1. 19 4
      QuestPDF/Previewer/PreviewerExtensions.cs
  2. 10 2
      QuestPDF/Previewer/PreviewerService.cs

+ 19 - 4
QuestPDF/Previewer/PreviewerExtensions.cs

@@ -2,6 +2,7 @@
 
 using System;
 using System.Collections.Generic;
+using System.Threading;
 using System.Threading.Tasks;
 using QuestPDF.Drawing;
 using QuestPDF.Infrastructure;
@@ -18,14 +19,17 @@ namespace QuestPDF.Previewer
         public static async Task ShowInPreviewerAsync(this IDocument document, int port = 12500)
         {
             var previewerService = new PreviewerService(port);
+            
+            var cancellationTokenSource = new CancellationTokenSource();
+            previewerService.OnPreviewerStopped += () => cancellationTokenSource.Cancel();
+            
             await previewerService.Connect();
             await RefreshPreview();
             
             HotReloadManager.UpdateApplicationRequested += (_, _) => RefreshPreview();
-
-            while (true)
-                await Task.Delay(TimeSpan.FromSeconds(1));
-
+            
+            await WaitForPreviewerExit(cancellationTokenSource.Token);
+            
             Task RefreshPreview()
             {
                 var pictures = GetPictures();
@@ -44,6 +48,17 @@ namespace QuestPDF.Previewer
                     }
                 }
             }
+
+            async Task WaitForPreviewerExit(CancellationToken cancellationToken)
+            {
+                while (true)
+                {
+                    if (cancellationToken.IsCancellationRequested)
+                        return;
+                
+                    await Task.Delay(TimeSpan.FromSeconds(1), cancellationToken);
+                }
+            }
         }
     }
 }

+ 10 - 2
QuestPDF/Previewer/PreviewerService.cs

@@ -13,7 +13,9 @@ namespace QuestPDF.Previewer
     internal class PreviewerService
     {
         private int Port { get; }
-        private HttpClient HttpClient { get; init; }
+        private HttpClient HttpClient { get; }
+        
+        public  event Action? OnPreviewerStopped;
         
         public PreviewerService(int port)
         {
@@ -74,6 +76,12 @@ namespace QuestPDF.Previewer
                 };
                 
                 process.Start();
+
+                Task.Run(async () =>
+                {
+                    await process.WaitForExitAsync();
+                    OnPreviewerStopped?.Invoke();
+                });
             }
             catch
             {
@@ -96,7 +104,7 @@ namespace QuestPDF.Previewer
         {
             while (true)
             {
-                await Task.Delay(TimeSpan.FromSeconds(1));
+                await Task.Delay(TimeSpan.FromMilliseconds(250));
 
                 var isConnected = await IsPreviewerAvailable();