|
|
@@ -160,8 +160,17 @@ namespace Grpc.Core
|
|
|
var deadlineTimespec = deadline.HasValue ? Timespec.FromDateTime(deadline.Value) : Timespec.InfFuture;
|
|
|
lock (myLock)
|
|
|
{
|
|
|
- // pass "tcs" as "state" for WatchConnectivityStateHandler.
|
|
|
- handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs);
|
|
|
+ if (handle.IsClosed)
|
|
|
+ {
|
|
|
+ // If channel has been already shutdown and handle was disposed, we would end up with
|
|
|
+ // an abandoned completion added to the completion registry. Instead, we make sure we fail early.
|
|
|
+ throw new ObjectDisposedException(nameof(handle), "Channel handle has already been disposed.");
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ // pass "tcs" as "state" for WatchConnectivityStateHandler.
|
|
|
+ handle.WatchConnectivityState(lastObservedState, deadlineTimespec, completionQueue, WatchConnectivityStateHandler, tcs);
|
|
|
+ }
|
|
|
}
|
|
|
return tcs.Task;
|
|
|
}
|