summaryrefslogtreecommitdiff
path: root/ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs
diff options
context:
space:
mode:
authorchai <215380520@qq.com>2023-05-12 09:24:40 +0800
committerchai <215380520@qq.com>2023-05-12 09:24:40 +0800
commit2a1cd4fda8a4a8e649910d16b4dfa1ce7ae63543 (patch)
treea471fafed72e80b4ac3ac3002e06c34220dd6058 /ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs
parentb8a694746562b37dc8dc5b8b5aec8612bb0964fc (diff)
*misc
Diffstat (limited to 'ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs')
-rw-r--r--ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs117
1 files changed, 117 insertions, 0 deletions
diff --git a/ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs b/ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs
new file mode 100644
index 0000000..c7c3bc1
--- /dev/null
+++ b/ThirdParty/CsvHelper-master/docs-src/CsvHelper.DocsGenerator/ConsoleHost.cs
@@ -0,0 +1,117 @@
+using System;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace CsvHelper.DocsGenerator
+{
+ public static class ConsoleHost
+ {
+ /// <summary>
+ /// Block the calling thread until shutdown is triggered via Ctrl+C or SIGTERM.
+ /// </summary>
+ public static void WaitForShutdown()
+ {
+ WaitForShutdownAsync().GetAwaiter().GetResult();
+ }
+
+ /// <summary>
+ /// Returns a Task that completes when shutdown is triggered via the given token, Ctrl+C or SIGTERM.
+ /// </summary>
+ /// <param name="token">The token to trigger shutdown.</param>
+ public static async Task WaitForShutdownAsync(CancellationToken token = default(CancellationToken))
+ {
+ var done = new ManualResetEventSlim(false);
+ using (var cts = CancellationTokenSource.CreateLinkedTokenSource(token))
+ {
+ AttachCtrlcSigtermShutdown(cts, done, shutdownMessage: string.Empty);
+ await WaitForTokenShutdownAsync(cts.Token);
+ done.Set();
+ }
+ }
+
+ /// <summary>
+ /// Runs an application and block the calling thread until host shutdown.
+ /// </summary>
+ /// <param name="host">The <see cref="IWebHost"/> to run.</param>
+ public static void Wait()
+ {
+ WaitAsync().GetAwaiter().GetResult();
+ }
+
+ /// <summary>
+ /// Runs an application and returns a Task that only completes when the token is triggered or shutdown is triggered.
+ /// </summary>
+ /// <param name="host">The <see cref="IConsoleHost"/> to run.</param>
+ /// <param name="token">The token to trigger shutdown.</param>
+ public static async Task WaitAsync(CancellationToken token = default(CancellationToken))
+ {
+ //Wait for the token shutdown if it can be cancelled
+ if (token.CanBeCanceled)
+ {
+ await WaitAsync(token, shutdownMessage: null);
+ return;
+ }
+
+ //If token cannot be cancelled, attach Ctrl+C and SIGTERN shutdown
+ var done = new ManualResetEventSlim(false);
+ using (var cts = new CancellationTokenSource())
+ {
+ AttachCtrlcSigtermShutdown(cts, done, shutdownMessage: "Application is shutting down...");
+ await WaitAsync(cts.Token, "Application running. Press Ctrl+C to shut down.");
+ done.Set();
+ }
+ }
+
+ private static async Task WaitAsync(CancellationToken token, string shutdownMessage)
+ {
+ if (!string.IsNullOrEmpty(shutdownMessage))
+ {
+ Console.WriteLine(shutdownMessage);
+ }
+
+ await WaitForTokenShutdownAsync(token);
+ }
+
+ private static void AttachCtrlcSigtermShutdown(CancellationTokenSource cts, ManualResetEventSlim resetEvent, string shutdownMessage)
+ {
+ Action ShutDown = () =>
+ {
+ if (!cts.IsCancellationRequested)
+ {
+ if (!string.IsNullOrWhiteSpace(shutdownMessage))
+ {
+ Console.WriteLine(shutdownMessage);
+ }
+
+ try
+ {
+ cts.Cancel();
+ }
+ catch (ObjectDisposedException) { }
+ }
+
+ // Wait on the given reset event
+ resetEvent.Wait();
+ };
+
+ AppDomain.CurrentDomain.ProcessExit += delegate { ShutDown(); };
+ Console.CancelKeyPress += (sender, eventArgs) =>
+ {
+ ShutDown();
+ //Don't terminate the process immediately, wait for the Main thread to exit gracefully.
+ eventArgs.Cancel = true;
+ };
+ }
+
+ private static async Task WaitForTokenShutdownAsync(CancellationToken token)
+ {
+ var waitForStop = new TaskCompletionSource<object>();
+ token.Register(obj =>
+ {
+ var tcs = (TaskCompletionSource<object>)obj;
+ tcs.TrySetResult(null);
+ }, waitForStop);
+ await waitForStop.Task;
+ }
+ }
+}