1
- using System ;
1
+ using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Diagnostics ;
4
4
using System . Linq ;
@@ -55,8 +55,7 @@ public virtual async Task CanAcquireAndReleaseLockAsync()
55
55
56
56
int counter = 0 ;
57
57
58
- bool isTraceLogLevelEnabled = _logger . IsEnabled ( LogLevel . Trace ) ;
59
- await Run . InParallelAsync ( 25 , async i =>
58
+ await Parallel . ForEachAsync ( Enumerable . Range ( 1 , 25 ) , async ( _ , _ ) =>
60
59
{
61
60
bool success = await locker . TryUsingAsync ( "test" , ( ) =>
62
61
{
@@ -183,14 +182,50 @@ public virtual async Task CanAcquireLocksInParallel()
183
182
if ( locker == null )
184
183
return ;
185
184
185
+ Log . SetLogLevel < CacheLockProvider > ( LogLevel . Trace ) ;
186
+
187
+ const int COUNT = 100 ;
188
+ int current = 1 ;
189
+ var used = new List < int > ( ) ;
190
+ int concurrency = 0 ;
191
+
192
+ await Parallel . ForEachAsync ( Enumerable . Range ( 1 , COUNT ) , async ( _ , ct ) =>
193
+ {
194
+ await using var myLock = await locker . AcquireAsync ( "test" , TimeSpan . FromMinutes ( 1 ) , TimeSpan . FromMinutes ( 1 ) ) ;
195
+ Assert . NotNull ( myLock ) ;
196
+
197
+ int currentConcurrency = Interlocked . Increment ( ref concurrency ) ;
198
+ Assert . Equal ( 1 , currentConcurrency ) ;
199
+
200
+ int item = current ;
201
+ await Task . Delay ( 10 , ct ) ;
202
+ used . Add ( item ) ;
203
+ current ++ ;
204
+
205
+ Interlocked . Decrement ( ref concurrency ) ;
206
+ } ) ;
207
+
208
+ var duplicates = used . GroupBy ( x => x ) . Where ( g => g . Count ( ) > 1 ) ;
209
+ Assert . Empty ( duplicates ) ;
210
+ Assert . Equal ( COUNT , used . Count ) ;
211
+ }
212
+
213
+ public virtual async Task CanAcquireScopedLocksInParallel ( )
214
+ {
215
+ var lockProvider = GetLockProvider ( ) ;
216
+ if ( lockProvider == null )
217
+ return ;
218
+
219
+ var locker = new ScopedLockProvider ( lockProvider , "scoped" ) ;
220
+
186
221
Log . SetLogLevel < CacheLockProvider > ( LogLevel . Debug ) ;
187
222
188
223
const int COUNT = 100 ;
189
224
int current = 1 ;
190
225
var used = new List < int > ( ) ;
191
226
int concurrency = 0 ;
192
227
193
- await Parallel . ForEachAsync ( Enumerable . Range ( 1 , COUNT ) , async ( index , ct ) =>
228
+ await Parallel . ForEachAsync ( Enumerable . Range ( 1 , COUNT ) , async ( _ , ct ) =>
194
229
{
195
230
await using var myLock = await locker . AcquireAsync ( "test" , TimeSpan . FromMinutes ( 1 ) , TimeSpan . FromMinutes ( 1 ) ) ;
196
231
Assert . NotNull ( myLock ) ;
@@ -211,6 +246,40 @@ await Parallel.ForEachAsync(Enumerable.Range(1, COUNT), async (index, ct) =>
211
246
Assert . Equal ( COUNT , used . Count ) ;
212
247
}
213
248
249
+ public virtual async Task CanAcquireMultipleLocksInParallel ( )
250
+ {
251
+ var locker = GetLockProvider ( ) ;
252
+ if ( locker == null )
253
+ return ;
254
+
255
+ Log . SetLogLevel < CacheLockProvider > ( LogLevel . Debug ) ;
256
+
257
+ const int COUNT = 100 ;
258
+ int current = 1 ;
259
+ var used = new List < int > ( ) ;
260
+ int concurrency = 0 ;
261
+
262
+ await Parallel . ForEachAsync ( Enumerable . Range ( 1 , COUNT ) , async ( _ , ct ) =>
263
+ {
264
+ await using var myLock = await locker . AcquireAsync ( [ "test" ] , TimeSpan . FromMinutes ( 1 ) , TimeSpan . FromMinutes ( 1 ) ) ;
265
+ Assert . NotNull ( myLock ) ;
266
+
267
+ int currentConcurrency = Interlocked . Increment ( ref concurrency ) ;
268
+ Assert . Equal ( 1 , currentConcurrency ) ;
269
+
270
+ int item = current ;
271
+ await Task . Delay ( 10 , ct ) ;
272
+ used . Add ( item ) ;
273
+ current ++ ;
274
+
275
+ Interlocked . Decrement ( ref concurrency ) ;
276
+ } ) ;
277
+
278
+ var duplicates = used . GroupBy ( x => x ) . Where ( g => g . Count ( ) > 1 ) ;
279
+ Assert . Empty ( duplicates ) ;
280
+ Assert . Equal ( COUNT , used . Count ) ;
281
+ }
282
+
214
283
public virtual async Task LockOneAtATimeAsync ( )
215
284
{
216
285
var locker = GetLockProvider ( ) ;
@@ -271,7 +340,6 @@ private Task<bool> DoLockedWorkAsync(ILockProvider locker)
271
340
272
341
public virtual async Task WillThrottleCallsAsync ( )
273
342
{
274
- Log . DefaultMinimumLevel = LogLevel . Trace ;
275
343
Log . SetLogLevel < ScheduledTimer > ( LogLevel . Information ) ;
276
344
Log . SetLogLevel < ThrottlingLockProvider > ( LogLevel . Trace ) ;
277
345
0 commit comments