public void Monitor_TryEnter_Invalid() { bool lockTaken = false; var obj = new object(); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, ref lockTaken)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, 1)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, 1, ref lockTaken)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, TimeSpan.Zero)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, TimeSpan.Zero, ref lockTaken)); //AssertExtensions.Throws<ArgumentOutOfRangeException>("millisecondsTimeout", () => Monitor.TryEnter(null, -1)); //AssertExtensions.Throws<ArgumentOutOfRangeException>("millisecondsTimeout", () => Monitor.TryEnter(null, -1, ref lockTaken)); //AssertExtensions.Throws<ArgumentOutOfRangeException>("timeout", () => Monitor.TryEnter(null, TimeSpan.FromMilliseconds(-1))); //AssertExtensions.Throws<ArgumentOutOfRangeException>("timeout", () => Monitor.TryEnter(null, TimeSpan.FromMilliseconds(-1), ref lockTaken)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, -1)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, -1, ref lockTaken)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, TimeSpan.FromMilliseconds(-1))); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.TryEnter(null, TimeSpan.FromMilliseconds(-1), ref lockTaken)); lockTaken = true; AssertExtensions.Throws <ArgumentException>("lockTaken", () => Monitor.TryEnter(obj, ref lockTaken)); lockTaken = true; AssertExtensions.Throws <ArgumentException>("lockTaken", () => Monitor.TryEnter(obj, 0, ref lockTaken)); lockTaken = true; AssertExtensions.Throws <ArgumentException>("lockTaken", () => Monitor.TryEnter(obj, TimeSpan.Zero, ref lockTaken)); }
public void Monitor_TryEnter_SetsLockTaken() { bool lockTaken = false; var obj = new object(); Monitor.TryEnter(obj, ref lockTaken); Assert.IsTrue(lockTaken); Monitor.Exit(obj); // The documentation does not specifies that lockTaken variable is // set to false after Exit is called //Assert.IsFalse(lockTaken); }
public void Monitor_BasicRecursion() { var obj = new object(); Assert.IsTrue(Monitor.TryEnter(obj)); Assert.IsTrue(Monitor.TryEnter(obj)); Monitor.Exit(obj); //Assert.IsTrue(Monitor.IsEntered(obj)); Monitor.Enter(obj); //Assert.IsTrue(Monitor.IsEntered(obj)); Monitor.Exit(obj); //Assert.IsTrue(Monitor.IsEntered(obj)); Monitor.Exit(obj); //Assert.IsFalse(Monitor.IsEntered(obj)); }
public void Monitor_DeepRecursion() { var obj = new object(); var hc = obj.GetHashCode(); // reduced from "(long)int.MaxValue + 2;" to something that will return in a more meaningful time const int limit = 10000; for (var i = 0L; i < limit; i++) { Assert.IsTrue(Monitor.TryEnter(obj)); } for (var j = 0L; j < (limit - 1); j++) { Monitor.Exit(obj); //Assert.IsTrue(Monitor.IsEntered(obj)); } Monitor.Exit(obj); //Assert.IsTrue(Monitor.IsEntered(obj)); }