Skip to content

Commit d2ed00a

Browse files
committed
Make async disposal test more deterministic.
1 parent edb63ea commit d2ed00a

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

test/Autofac.Test/Core/DisposerTests.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,9 @@ public void CannotAddObjectsToDisposerAfterSyncDispose()
6161
[Fact]
6262
public async Task DisposerDisposesOfObjectsAsyncIfIAsyncDisposableDeclared()
6363
{
64-
var instance = new AsyncDisposeTracker();
64+
var semaphore = new SemaphoreSlim(1);
65+
var instance = new AsyncDisposeTracker(semaphore);
66+
await semaphore.WaitAsync();
6567

6668
var disposer = new Disposer();
6769
disposer.AddInstanceForDisposal(instance);
@@ -74,6 +76,7 @@ public async Task DisposerDisposesOfObjectsAsyncIfIAsyncDisposableDeclared()
7476
Assert.False(instance.IsAsyncDisposed);
7577

7678
// Now we wait.
79+
semaphore.Release();
7780
await result;
7881

7982
Assert.False(instance.IsSyncDisposed);

test/Autofac.Test/Util/AsyncDisposeTracker.cs

Lines changed: 27 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,24 @@ namespace Autofac.Test.Util;
55

66
public sealed class AsyncDisposeTracker : IDisposable, IAsyncDisposable
77
{
8+
private readonly SemaphoreSlim _semaphore;
9+
810
public event EventHandler<EventArgs> Disposing;
911

1012
public bool IsSyncDisposed { get; set; }
1113

1214
public bool IsAsyncDisposed { get; set; }
1315

16+
public AsyncDisposeTracker()
17+
: this(null)
18+
{
19+
}
20+
21+
public AsyncDisposeTracker(SemaphoreSlim semaphore)
22+
{
23+
_semaphore = semaphore;
24+
}
25+
1426
public void Dispose()
1527
{
1628
IsSyncDisposed = true;
@@ -20,10 +32,20 @@ public void Dispose()
2032

2133
public async ValueTask DisposeAsync()
2234
{
23-
await Task.Delay(1);
24-
25-
IsAsyncDisposed = true;
26-
27-
Disposing?.Invoke(this, EventArgs.Empty);
35+
if (_semaphore != null)
36+
{
37+
await _semaphore.WaitAsync();
38+
}
39+
40+
try
41+
{
42+
IsAsyncDisposed = true;
43+
44+
Disposing?.Invoke(this, EventArgs.Empty);
45+
}
46+
finally
47+
{
48+
_semaphore?.Release();
49+
}
2850
}
2951
}

0 commit comments

Comments
 (0)