using System.Threading.Tasks;
public static class Locks
public static readonly AsyncLock ReadLock = new();
public static readonly AsyncLock WriteLock = new();
public class ThreadLikeSomethingProcessor
private static AwaitableDisposable<IDisposable>? _writeLockTask;
public static void Main()
_writeLockTask = Locks.WriteLock.LockAsync();
for (var i = 0; i < 10; ++i)
var thread = new Thread(DoWork);
private static void ReadData(object num)
Console.WriteLine($"read {num}");
private static void WriteData(object num)
Console.WriteLine($"write {num}");
public static void DoWork(object num)
if (_writeLockTask == null)
var wLock = await _writeLockTask.Value;