@@ -92,13 +92,22 @@ public virtual async Task<ErrorResponse> RouteRequest(TDescriptor descriptor, Re
92
92
var mediator = scope . ServiceProvider . GetRequiredService < IMediator > ( ) ;
93
93
94
94
var id = GetId ( request . Id ) ;
95
- var cts = new CancellationTokenSource ( ) ;
95
+ if ( ! _requests . TryGetValue ( id , out var cts ) )
96
+ {
97
+ cts = new CancellationTokenSource ( ) ;
98
+ _requests . TryAdd ( id , cts ) ;
99
+ }
96
100
token . Register ( cts . Cancel ) ;
97
- _requests . TryAdd ( id , cts ) ;
98
101
99
102
// TODO: Try / catch for Internal Error
100
103
try
101
104
{
105
+ if ( cts . IsCancellationRequested )
106
+ {
107
+ _logger . LogDebug ( "Request {Id} was cancelled" , id ) ;
108
+ return new RequestCancelled ( ) ;
109
+ }
110
+
102
111
// To avoid boxing, the best way to compare generics for equality is with EqualityComparer<T>.Default.
103
112
// This respects IEquatable<T> (without boxing) as well as object.Equals, and handles all the Nullable<T> "lifted" nuances.
104
113
// https://stackoverflow.com/a/864860
@@ -176,13 +185,17 @@ public virtual async Task<ErrorResponse> RouteRequest(TDescriptor descriptor, Re
176
185
177
186
public void CancelRequest ( object id )
178
187
{
179
- if ( _requests . TryGetValue ( GetId ( id ) , out var cts ) )
188
+ var idValue = GetId ( id ) ;
189
+ if ( _requests . TryGetValue ( idValue , out var cts ) )
180
190
{
181
191
cts . Cancel ( ) ;
182
192
}
183
193
else
184
194
{
185
- _logger . LogDebug ( "Request {Id} was not found to cancel" , id ) ;
195
+ cts = new CancellationTokenSource ( ) ;
196
+ _requests . TryAdd ( idValue , cts ) ;
197
+ cts . Cancel ( ) ;
198
+ _logger . LogDebug ( "Request {Id} was not found to cancel, stubbing it in." , id ) ;
186
199
}
187
200
}
188
201
0 commit comments