<PackageReference Include="Relativity.Transfer.Client" Version="7.0.8" />

AsyncLock

public sealed class AsyncLock : IDisposable
using System.Collections.Generic; namespace System.Reactive.Concurrency { public sealed class AsyncLock : IDisposable { private readonly Queue<Action> queue = new Queue<Action>(); private bool isAcquired; private bool hasFaulted; public void Wait(Action action) { if (action == null) throw new ArgumentNullException("action"); bool flag = false; lock (queue) { if (!hasFaulted) { queue.Enqueue(action); flag = !isAcquired; isAcquired = true; } } if (flag) { while (true) { Action action2 = null; lock (queue) { if (queue.Count <= 0) { isAcquired = false; return; } action2 = queue.Dequeue(); } try { action2(); } catch { lock (queue) { queue.Clear(); hasFaulted = true; } throw; } } } } public void Dispose() { lock (queue) { queue.Clear(); hasFaulted = true; } } } }