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