From 4ea8ce19ea2c6d2f9629e06955b0ce62e82266da Mon Sep 17 00:00:00 2001 From: Jan Tattermusch <jtattermusch@google.com> Date: Mon, 7 Aug 2017 16:26:02 +0200 Subject: [PATCH] add GrpcEnvironment.ShuttingDown event --- src/csharp/Grpc.Core/GrpcEnvironment.cs | 28 +++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/csharp/Grpc.Core/GrpcEnvironment.cs b/src/csharp/Grpc.Core/GrpcEnvironment.cs index 0663ee9215..a466c9fa37 100644 --- a/src/csharp/Grpc.Core/GrpcEnvironment.cs +++ b/src/csharp/Grpc.Core/GrpcEnvironment.cs @@ -43,13 +43,15 @@ namespace Grpc.Core static readonly HashSet<Channel> registeredChannels = new HashSet<Channel>(); static readonly HashSet<Server> registeredServers = new HashSet<Server>(); + static EventHandler shuttingDown; + static ILogger logger = new NullLogger(); readonly GrpcThreadPool threadPool; readonly DebugStats debugStats = new DebugStats(); readonly AtomicCounter cqPickerCounter = new AtomicCounter(); - bool isClosed; + bool isShutdown; /// <summary> /// Returns a reference-counted instance of initialized gRPC environment. @@ -237,6 +239,21 @@ namespace Grpc.Core } } + /// <summary> + /// Occurs when <c>GrpcEnvironment</c> is about the start the shutdown logic. + /// </summary> + public static event EventHandler ShuttingDown + { + add + { + shuttingDown += value; + } + remove + { + shuttingDown -= value; + } + } + /// <summary> /// Creates gRPC environment. /// </summary> @@ -311,13 +328,16 @@ namespace Grpc.Core /// </summary> private async Task ShutdownAsync() { - if (isClosed) + if (isShutdown) { - throw new InvalidOperationException("Close has already been called"); + throw new InvalidOperationException("ShutdownAsync has already been called"); } + + await Task.Run(() => shuttingDown.Invoke(this, null)); + await threadPool.StopAsync().ConfigureAwait(false); GrpcNativeShutdown(); - isClosed = true; + isShutdown = true; debugStats.CheckOK(); } -- GitLab