blob: 17747f86caadf69d3aac4b8f36cd17d7c07ebe29 [file] [log] [blame]
Jan Tattermusched4b7a72015-07-21 11:46:43 -07001#region Copyright notice and license
2
Jan Tattermusch7897ae92017-06-07 22:57:36 +02003// Copyright 2015 gRPC authors.
Jan Tattermusched4b7a72015-07-21 11:46:43 -07004//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02005// Licensed under the Apache License, Version 2.0 (the "License");
6// you may not use this file except in compliance with the License.
7// You may obtain a copy of the License at
Jan Tattermusched4b7a72015-07-21 11:46:43 -07008//
Jan Tattermusch7897ae92017-06-07 22:57:36 +02009// http://www.apache.org/licenses/LICENSE-2.0
Jan Tattermusched4b7a72015-07-21 11:46:43 -070010//
Jan Tattermusch7897ae92017-06-07 22:57:36 +020011// Unless required by applicable law or agreed to in writing, software
12// distributed under the License is distributed on an "AS IS" BASIS,
13// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14// See the License for the specific language governing permissions and
15// limitations under the License.
Jan Tattermusched4b7a72015-07-21 11:46:43 -070016
17#endregion
18
19using System;
20using System.Runtime.CompilerServices;
21using System.Threading.Tasks;
22
23namespace Grpc.Core
24{
25 /// <summary>
26 /// Return type for single request - single response call.
27 /// </summary>
Jan Tattermusch12855fc2015-08-24 16:43:23 -070028 /// <typeparam name="TResponse">Response message type for this call.</typeparam>
Jan Tattermusched4b7a72015-07-21 11:46:43 -070029 public sealed class AsyncUnaryCall<TResponse> : IDisposable
30 {
Jan Tattermuscha236ff22015-07-21 12:33:31 -070031 readonly Task<TResponse> responseAsync;
Jan Tattermuschfb34a992015-08-21 10:45:39 -070032 readonly Task<Metadata> responseHeadersAsync;
Jan Tattermusched4b7a72015-07-21 11:46:43 -070033 readonly Func<Status> getStatusFunc;
34 readonly Func<Metadata> getTrailersFunc;
35 readonly Action disposeAction;
36
Mehrdad Afshari4d7f4082017-10-06 14:51:11 -070037
38 /// <summary>
39 /// Creates a new AsyncUnaryCall object with the specified properties.
40 /// </summary>
41 /// <param name="responseAsync">The response of the asynchronous call.</param>
42 /// <param name="responseHeadersAsync">Response headers of the asynchronous call.</param>
43 /// <param name="getStatusFunc">Delegate returning the status of the call.</param>
44 /// <param name="getTrailersFunc">Delegate returning the trailing metadata of the call.</param>
45 /// <param name="disposeAction">Delegate to invoke when Dispose is called on the call object.</param>
46 public AsyncUnaryCall(Task<TResponse> responseAsync,
47 Task<Metadata> responseHeadersAsync,
48 Func<Status> getStatusFunc,
49 Func<Metadata> getTrailersFunc,
50 Action disposeAction)
Jan Tattermusched4b7a72015-07-21 11:46:43 -070051 {
Jan Tattermuscha236ff22015-07-21 12:33:31 -070052 this.responseAsync = responseAsync;
Jan Tattermuschfb34a992015-08-21 10:45:39 -070053 this.responseHeadersAsync = responseHeadersAsync;
Jan Tattermusched4b7a72015-07-21 11:46:43 -070054 this.getStatusFunc = getStatusFunc;
55 this.getTrailersFunc = getTrailersFunc;
56 this.disposeAction = disposeAction;
57 }
58
59 /// <summary>
60 /// Asynchronous call result.
61 /// </summary>
Jan Tattermuscha236ff22015-07-21 12:33:31 -070062 public Task<TResponse> ResponseAsync
Jan Tattermusched4b7a72015-07-21 11:46:43 -070063 {
64 get
65 {
Jan Tattermuscha236ff22015-07-21 12:33:31 -070066 return this.responseAsync;
Jan Tattermusched4b7a72015-07-21 11:46:43 -070067 }
68 }
69
70 /// <summary>
Jan Tattermuschfb34a992015-08-21 10:45:39 -070071 /// Asynchronous access to response headers.
72 /// </summary>
73 public Task<Metadata> ResponseHeadersAsync
74 {
75 get
76 {
77 return this.responseHeadersAsync;
78 }
79 }
80
81 /// <summary>
Jan Tattermusched4b7a72015-07-21 11:46:43 -070082 /// Allows awaiting this object directly.
83 /// </summary>
84 public TaskAwaiter<TResponse> GetAwaiter()
85 {
Jan Tattermuscha236ff22015-07-21 12:33:31 -070086 return responseAsync.GetAwaiter();
Jan Tattermusched4b7a72015-07-21 11:46:43 -070087 }
88
89 /// <summary>
90 /// Gets the call status if the call has already finished.
91 /// Throws InvalidOperationException otherwise.
92 /// </summary>
93 public Status GetStatus()
94 {
95 return getStatusFunc();
96 }
97
98 /// <summary>
99 /// Gets the call trailing metadata if the call has already finished.
100 /// Throws InvalidOperationException otherwise.
101 /// </summary>
102 public Metadata GetTrailers()
103 {
104 return getTrailersFunc();
105 }
106
107 /// <summary>
108 /// Provides means to cleanup after the call.
109 /// If the call has already finished normally (request stream has been completed and call result has been received), doesn't do anything.
110 /// Otherwise, requests cancellation of the call which should terminate all pending async operations associated with the call.
111 /// As a result, all resources being used by the call should be released eventually.
112 /// </summary>
Jan Tattermusch6acc07d2016-06-03 17:03:30 -0700113 /// <remarks>
114 /// Normally, there is no need for you to dispose the call unless you want to utilize the
115 /// "Cancel" semantics of invoking <c>Dispose</c>.
116 /// </remarks>
Jan Tattermusched4b7a72015-07-21 11:46:43 -0700117 public void Dispose()
118 {
119 disposeAction.Invoke();
120 }
121 }
122}