11namespace UiPath . CoreIpc ;
2-
3- using RequestCompletionSource = TaskCompletionSource < Response > ;
2+ using static TaskCompletionPool < Response > ;
43using static IOHelpers ;
54public sealed class Connection : IDisposable
65{
7- private readonly ConcurrentDictionary < string , RequestCompletionSource > _requests = new ( ) ;
6+ private static readonly IOException ClosedException = new ( "Connection closed." ) ;
7+ private readonly ConcurrentDictionary < string , ManualResetValueTaskSource > _requests = new ( ) ;
88 private long _requestCounter = - 1 ;
99 private readonly int _maxMessageSize ;
1010 private readonly Lazy < Task > _receiveLoop ;
@@ -47,19 +47,20 @@ public Connection(Stream network, ISerializer serializer, ILogger logger, string
4747#endif
4848 internal async ValueTask < Response > RemoteCall ( Request request , CancellationToken token )
4949 {
50- var requestCompletion = new RequestCompletionSource ( ) ;
50+ var requestCompletion = Rent ( ) ;
5151 _requests [ request . Id ] = requestCompletion ;
5252 CancellationTokenRegistration tokenRegistration = default ;
5353 try
5454 {
5555 await Send ( request , token ) ;
5656 tokenRegistration = token . UnsafeRegister ( request . UploadStream == null ? _cancelRequest : _cancelUploadRequest , request . Id ) ;
57- return await requestCompletion . Task ;
57+ return await requestCompletion . ValueTask ( ) ;
5858 }
5959 finally
6060 {
61- tokenRegistration . Dispose ( ) ;
6261 _requests . TryRemove ( request . Id , out _ ) ;
62+ tokenRegistration . Dispose ( ) ;
63+ requestCompletion . Return ( ) ;
6364 }
6465 }
6566 internal ValueTask Send ( Request request , CancellationToken token )
@@ -85,9 +86,9 @@ void CancelUploadRequest(string requestId)
8586 }
8687 private void TryCancelRequest ( string requestId )
8788 {
88- if ( _requests . TryGetValue ( requestId , out var requestCompletion ) )
89+ if ( _requests . TryRemove ( requestId , out var requestCompletion ) )
8990 {
90- requestCompletion . TrySetCanceled ( ) ;
91+ requestCompletion . SetCanceled ( ) ;
9192 }
9293 }
9394 internal ValueTask Send ( Response response , CancellationToken cancellationToken )
@@ -165,9 +166,12 @@ public void Dispose()
165166 }
166167 private void CompleteRequests ( )
167168 {
168- foreach ( var completionSource in _requests . Values )
169+ foreach ( var requestId in _requests . Keys )
169170 {
170- completionSource . TrySetException ( new IOException ( "Connection closed." ) ) ;
171+ if ( _requests . TryRemove ( requestId , out var requestCompletion ) )
172+ {
173+ requestCompletion . SetException ( ClosedException ) ;
174+ }
171175 }
172176 }
173177#if ! NET461
@@ -287,7 +291,7 @@ private async Task EnterStreamMode()
287291 {
288292 if ( ! await ReadBuffer ( sizeof ( long ) ) )
289293 {
290- throw new IOException ( "Connection closed." ) ;
294+ throw ClosedException ;
291295 }
292296 var userStreamLength = BitConverter . ToInt64 ( _buffer , startIndex : 0 ) ;
293297 _nestedStream . Reset ( userStreamLength ) ;
@@ -340,9 +344,9 @@ private void OnResponseReceived(Response response)
340344 {
341345 Log ( $ "Received response for request { response . RequestId } { Name } .") ;
342346 }
343- if ( _requests . TryGetValue ( response . RequestId , out var completionSource ) )
347+ if ( _requests . TryRemove ( response . RequestId , out var completionSource ) )
344348 {
345- completionSource . TrySetResult ( response ) ;
349+ completionSource . SetResult ( response ) ;
346350 }
347351 }
348352 catch ( Exception ex )
0 commit comments