namespace locking { public class LockTest { private ReaderWriterLockSlim m_lock = new(); public void DoWork(int i) { Console.WriteLine($"{i}: DoWork()"); m_lock.EnterUpgradeableReadLock(); Console.WriteLine($"{i}: acquired read lock"); try { Thread.Yield(); Thread.Sleep(500); Thread.Yield(); Console.WriteLine($"{i}: sleep complete"); if (m_lock.TryEnterWriteLock(timeout: TimeSpan.FromMilliseconds(500))) { try { Console.WriteLine($"{i}: acquired write lock"); Thread.Yield(); Thread.Sleep(500); Thread.Yield(); } finally { m_lock.ExitWriteLock(); Console.WriteLine($"{i}: released write lock"); Thread.Yield(); } } else { Console.WriteLine($"{i}: failed to acquire write lock"); Thread.Yield(); } } finally { m_lock.ExitUpgradeableReadLock(); Console.WriteLine($"{i}: released read lock"); } } } internal class Program { static void Main(string[] args) { var lockTest = new LockTest(); var tasks = Enumerable.Range(1, 10).Select(i => Task.Run(() => lockTest.DoWork(i))).ToArray(); Task.WaitAll(tasks); } } }