Async/Awaitable non-blocking lock in C#