@@ -12,9 +12,13 @@ public sealed class AsyncLock
1212 public AsyncLock ( )
1313 {
1414 _syncObj = _waitingWriters ;
15+
16+ _readerReleaserTask = Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Read , true ) ) ;
17+ _writerReleaserTask = Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Write , true ) ) ;
1518 }
1619
1720 internal AsyncLock ( object syncObject )
21+ : this ( )
1822 {
1923 _syncObj = syncObject ;
2024 }
@@ -24,6 +28,10 @@ internal AsyncLock(object syncObject)
2428 private readonly Queue < TaskCompletionSource < AsyncLockReleaser > > _waitingReaders = new Queue < TaskCompletionSource < AsyncLockReleaser > > ( ) ;
2529 private readonly Queue < TaskCompletionSource < AsyncLockReleaser > > _waitingWriters = new Queue < TaskCompletionSource < AsyncLockReleaser > > ( ) ;
2630
31+ private readonly Task < AsyncLockReleaser > _readerReleaserTask ;
32+ private readonly Task < AsyncLockReleaser > _writerReleaserTask ;
33+
34+
2735 private int _readersRunning ;
2836
2937 private bool _isWriterRunning = false ;
@@ -85,7 +93,7 @@ public Task<AsyncLockReleaser> ReaderLockAsync(CancellationToken cancellation =
8593 if ( _isWriterRunning == false && _waitingWriters . Count == 0 )
8694 {
8795 _readersRunning ++ ;
88- return Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Read , true ) ) ;
96+ return _readerReleaserTask ;
8997 }
9098 else
9199 {
@@ -108,7 +116,7 @@ public Task<AsyncLockReleaser> WriterLockAsync(CancellationToken cancellation =
108116 if ( _isWriterRunning == false && _readersRunning == 0 )
109117 {
110118 _isWriterRunning = true ;
111- return Task . FromResult ( new AsyncLockReleaser ( this , AsyncLockType . Write , true ) ) ;
119+ return _writerReleaserTask ;
112120 }
113121 else
114122 {
@@ -119,7 +127,7 @@ public Task<AsyncLockReleaser> WriterLockAsync(CancellationToken cancellation =
119127 }
120128 }
121129
122- internal void Release ( AsyncLockReleaser releaser , bool sendReleasedEvent = true )
130+ internal void Release ( AsyncLockReleaser releaser )
123131 {
124132 lock ( _syncObj )
125133 {
@@ -136,7 +144,7 @@ internal void Release(AsyncLockReleaser releaser, bool sendReleasedEvent = true)
136144 }
137145 finally
138146 {
139- if ( sendReleasedEvent )
147+ if ( State == AsyncLockState . Idle )
140148 {
141149 Released ? . Invoke ( this ) ;
142150 }
0 commit comments