public void WaitingAlreadyCompleted() { var needle = new LazyNeedle <int>(5); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); needle.Wait(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); needle.Initialize(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); }
public void Waiting() { var waitStarted = 0; var threadDone = 0; var control = 0; var readed = 0; var needle = new LazyNeedle <int>(() => { Interlocked.Increment(ref control); return(5); }); var threadA = new Thread(() => { Thread.VolatileWrite(ref waitStarted, 1); needle.Wait(); needle.Initialize(); Interlocked.Increment(ref threadDone); }); var threadB = new Thread ( () => { while (Thread.VolatileRead(ref waitStarted) == 0) { Thread.Sleep(0); } readed = needle.Value; } ); threadA.Start(); threadB.Start(); threadA.Join(); threadB.Join(); needle.Initialize(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(readed, 5); Assert.AreEqual(needle.Value, 5); Assert.AreEqual(control, 1); Assert.AreEqual(threadDone, 1); Assert.AreEqual(waitStarted, 1); }
public void WaitingAlreadyCompleted() { var needle = new LazyNeedle<int>(5); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); needle.Wait(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); needle.Initialize(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(needle.Value, 5); }
public void Waiting() { var waitStarted = 0; var threadDone = 0; var control = 0; var readed = 0; var needle = new LazyNeedle<int>(() => { Interlocked.Increment(ref control); return 5; }); var threadA = new Thread(() => { Thread.VolatileWrite(ref waitStarted, 1); needle.Wait(); needle.Initialize(); Interlocked.Increment(ref threadDone); }); var threadB = new Thread ( () => { while (Thread.VolatileRead(ref waitStarted) == 0) { Thread.Sleep(0); } readed = needle.Value; } ); threadA.Start(); threadB.Start(); threadA.Join(); threadB.Join(); needle.Initialize(); Assert.IsTrue(needle.IsCompleted); Assert.AreEqual(readed, 5); Assert.AreEqual(needle.Value, 5); Assert.AreEqual(control, 1); Assert.AreEqual(threadDone, 1); Assert.AreEqual(waitStarted, 1); }