public void Monitor_WaitTest() { var obj = new object(); var waitTests = new Func <bool>[] { () => Monitor.Wait(obj, FailTimeoutMilliseconds), () => Monitor.Wait(obj, FailTimeoutMilliseconds), () => Monitor.Wait(obj, TimeSpan.FromMilliseconds(FailTimeoutMilliseconds)), () => Monitor.Wait(obj, TimeSpan.FromMilliseconds(FailTimeoutMilliseconds)), }; var t = new Thread(() => { Monitor.Enter(obj); for (int i = 0; i < waitTests.Length; ++i) { Monitor.Pulse(obj); Monitor.Wait(obj, FailTimeoutMilliseconds); } Monitor.Exit(obj); }); t.IsBackground = true; Monitor.Enter(obj); t.Start(); foreach (var waitTest in waitTests) { Assert.IsTrue(waitTest()); Monitor.Pulse(obj); } Monitor.Exit(obj); }
public void Monitor_Enter_SetsLockTaken() { bool lockTaken = false; var obj = new object(); Monitor.Enter(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_Enter_Invalid() { bool lockTaken = false; var obj = new object(); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.Enter(null)); AssertExtensions.Throws <ArgumentNullException>("obj", () => Monitor.Enter(null, ref lockTaken)); Assert.IsFalse(lockTaken); lockTaken = true; AssertExtensions.Throws <ArgumentException>("lockTaken", () => Monitor.Enter(obj, ref lockTaken)); 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)); }