internal static async Task WaitForPluginExitAsync()

in CredentialProvider.Microsoft/Program.cs [235:270]


        internal static async Task WaitForPluginExitAsync(IPlugin plugin, ILogger logger, TimeSpan shutdownTimeout)
        {
            var beginShutdownTaskSource = new TaskCompletionSource<object>();
            var endShutdownTaskSource = new TaskCompletionSource<object>();

            plugin.Connection.Faulted += (sender, a) =>
            {
                logger.Error(string.Format(Resources.FaultedOnMessage, $"{a.Message?.Type} {a.Message?.Method} {a.Message?.RequestId}"));
                logger.Error(a.Exception.ToString());
            };

            plugin.BeforeClose += (sender, args) =>
            {
                Volatile.Write(ref shuttingDown, true);
                beginShutdownTaskSource.TrySetResult(null);
            };

            plugin.Closed += (sender, a) =>
            {
                // beginShutdownTaskSource should already be set in BeforeClose, but just in case do it here too
                beginShutdownTaskSource.TrySetResult(null);

                endShutdownTaskSource.TrySetResult(null);
            };

            await beginShutdownTaskSource.Task;
            using (new Timer(_ => endShutdownTaskSource.TrySetCanceled(), null, shutdownTimeout, TimeSpan.FromMilliseconds(-1)))
            {
                await endShutdownTaskSource.Task;
            }

            if (endShutdownTaskSource.Task.IsCanceled)
            {
                logger.Error(Resources.PluginTimedOut);
            }
        }