/// <summary> /// Handler for unary response completion. /// </summary> private void HandleUnaryResponse(bool success, BatchContextSafeHandle ctx) { var fullStatus = ctx.GetReceivedStatusOnClient(); lock (myLock) { finished = true; finishedStatus = fullStatus; halfclosed = true; ReleaseResourcesIfPossible(); } if (!success) { unaryResponseTcs.SetException(new RpcException(new Status(StatusCode.Internal, "Internal error occured."))); return; } var status = fullStatus.Status; if (status.StatusCode != StatusCode.OK) { unaryResponseTcs.SetException(new RpcException(status)); return; } // TODO: handle deserialization error TResponse msg; TryDeserialize(ctx.GetReceivedMessage(), out msg); unaryResponseTcs.SetResult(msg); }
/// <summary> /// Handles receive status completion for calls with streaming response. /// </summary> private void HandleFinished(bool success, BatchContextSafeHandle ctx) { var fullStatus = ctx.GetReceivedStatusOnClient(); AsyncCompletionDelegate <TResponse> origReadCompletionDelegate = null; lock (myLock) { finished = true; finishedStatus = fullStatus; origReadCompletionDelegate = readCompletionDelegate; ReleaseResourcesIfPossible(); } ProcessLastRead(origReadCompletionDelegate); }