private static async Task CheckAsyncValueLockReentranceAsync <T>(AsyncValueLock <T> asyncLock, T value, int maxReentrances = 2) { using (await asyncLock.AcquireAsync(value)) { Console.WriteLine($"Lock taken for value: {value} as reentrance: {maxReentrances}.. TaskId: {asyncLock.GetTaskId(value)}"); if (maxReentrances > 0) { await CheckAsyncValueLockReentranceAsync <T>(asyncLock, value, maxReentrances - 1); } Console.WriteLine($"Press any key to release lock for value: {value} reentrance: {maxReentrances}.. TaskId: {asyncLock.GetTaskId(value)}"); Console.ReadKey(); } }
static void Main(string[] args) { Console.WriteLine("Creating AsyncLock object.."); using (var asyncLock = new AsyncLock()) { var checkTask1 = Task.Run(async() => await CheckAsyncLockReentranceAsync(asyncLock)); var checkTask2 = Task.Run(async() => await CheckAsyncLockReentranceAsync(asyncLock)); Console.WriteLine("Creating AsyncLock<string> object.."); var key1 = "Faraz"; var key2 = "Masood"; var asyncValueLock = new AsyncValueLock <string>(); var checkValueTask1 = Task.Run(async() => await CheckAsyncValueLockReentranceAsync(asyncValueLock, key1)); var checkValueTask2 = Task.Run(async() => await CheckAsyncValueLockReentranceAsync(asyncValueLock, key2)); Task.WaitAll(checkTask1, checkTask2, checkValueTask1, checkValueTask2); Console.WriteLine("Press any key to stop.."); Console.ReadKey(); } }