@@ -281,7 +281,6 @@ out DbConnectionInternal? recycledConnection
281281 }
282282
283283 [ Fact ]
284- [ ActiveIssue ( "https://github.com/dotnet/SqlClient/issues/3730" ) ]
285284 public async Task GetConnectionMaxPoolSize_ShouldRespectOrderOfRequest ( )
286285 {
287286 // Arrange
@@ -308,29 +307,31 @@ out DbConnectionInternal? internalConnection
308307 Assert . NotNull ( internalConnection ) ;
309308 }
310309
311- // Use ManualResetEventSlim to synchronize the tasks
312- // and force the request queueing order.
313- using ManualResetEventSlim mresQueueOrder = new ( ) ;
314- using CountdownEvent allRequestsQueued = new ( 2 ) ;
310+ // Use multiple ManualResetEventSlim to ensure proper ordering
311+ using ManualResetEventSlim firstTaskReady = new ( false ) ;
312+ using ManualResetEventSlim secondTaskReady = new ( false ) ;
313+ using ManualResetEventSlim startRequests = new ( false ) ;
315314
316315 // Act
317316 var recycledTask = Task . Run ( ( ) =>
318317 {
319- mresQueueOrder . Set ( ) ;
320- allRequestsQueued . Signal ( ) ;
318+ firstTaskReady . Set ( ) ;
319+ startRequests . Wait ( ) ;
321320 pool . TryGetConnection (
322- new SqlConnection ( "" ) ,
321+ new SqlConnection ( "Timeout=5000 " ) ,
323322 null ,
324323 new DbConnectionOptions ( "" , null ) ,
325324 out DbConnectionInternal ? recycledConnection
326325 ) ;
327326 return recycledConnection ;
328327 } ) ;
328+
329329 var failedTask = Task . Run ( ( ) =>
330330 {
331- // Force this request to be second in the queue.
332- mresQueueOrder . Wait ( ) ;
333- allRequestsQueued . Signal ( ) ;
331+ secondTaskReady . Set ( ) ;
332+ startRequests . Wait ( ) ;
333+ // Add a small delay to ensure this request comes after the first
334+ Thread . Sleep ( 50 ) ;
334335 pool . TryGetConnection (
335336 new SqlConnection ( "Timeout=1" ) ,
336337 null ,
@@ -340,7 +341,20 @@ out DbConnectionInternal? failedConnection
340341 return failedConnection ;
341342 } ) ;
342343
343- allRequestsQueued . Wait ( ) ;
344+ // Wait for both tasks to be ready before starting the requests
345+ firstTaskReady . Wait ( ) ;
346+ secondTaskReady . Wait ( ) ;
347+
348+ // Use SpinWait to ensure both tasks are actually waiting
349+ SpinWait . SpinUntil ( ( ) => false , 100 ) ;
350+
351+ // Start both requests
352+ startRequests . Set ( ) ;
353+
354+ // Give time for both requests to be queued
355+ await Task . Delay ( 200 ) ;
356+
357+ // Return the connection which should satisfy the first queued request
344358 pool . ReturnInternalConnection ( firstConnection ! , firstOwningConnection ) ;
345359 var recycledConnection = await recycledTask ;
346360
@@ -350,7 +364,6 @@ out DbConnectionInternal? failedConnection
350364 }
351365
352366 [ Fact ]
353- [ ActiveIssue ( "https://github.com/dotnet/SqlClient/issues/3730" ) ]
354367 public async Task GetConnectionAsyncMaxPoolSize_ShouldRespectOrderOfRequest ( )
355368 {
356369 // Arrange
@@ -382,14 +395,14 @@ out DbConnectionInternal? internalConnection
382395
383396 // Act
384397 var exceeded = pool . TryGetConnection (
385- new SqlConnection ( "" ) ,
398+ new SqlConnection ( "Timeout=5000 " ) ,
386399 recycledTaskCompletionSource ,
387400 new DbConnectionOptions ( "" , null ) ,
388401 out DbConnectionInternal ? recycledConnection
389402 ) ;
390403
391- // Gives time for the recycled connection to be queued before the failed request is initiated.
392- await Task . Delay ( 1000 ) ;
404+ // Ensure sufficient time for the recycled connection request to be fully queued
405+ await Task . Delay ( 200 ) ;
393406
394407 var exceeded2 = pool . TryGetConnection (
395408 new SqlConnection ( "Timeout=1" ) ,
@@ -398,6 +411,9 @@ out DbConnectionInternal? recycledConnection
398411 out DbConnectionInternal ? failedConnection
399412 ) ;
400413
414+ // Ensure the second request is also queued
415+ await Task . Delay ( 100 ) ;
416+
401417 pool . ReturnInternalConnection ( firstConnection ! , firstOwningConnection ) ;
402418 recycledConnection = await recycledTaskCompletionSource . Task ;
403419
0 commit comments