예제 #1
0
        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);
        }
예제 #2
0
        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);
        }
예제 #3
0
 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);
 }
예제 #4
0
 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);
 }