Exemple #1
0
        public void TestAddWorkListToDisposedList()
        {
            WaitAndContinueList work = new WaitAndContinueList();

            work.Dispose();
            work.AddWork(new WaitAndContinueList());
        }
Exemple #2
0
        public void TestPerformWork()
        {
            WaitAndContinueList work = new WaitAndContinueList();
            SampleWork          item1, item2;
            IWaitAndContinue    signaled;

            work.AddWork(item1 = new SampleWork());
            work.AddWork(item2 = new SampleWork());

            Assert.AreEqual(2, work.Count);
            Assert.IsFalse(work.IsEmpty);

            //normally done as a loop: while(work.Perform(timeout)) { }
            Assert.IsFalse(work.PerformWork(1));
            item2.Ready.Set();
            Assert.IsTrue(work.PerformWork(0));
            Assert.IsTrue(item2.Completed);
            Assert.IsTrue(item2.Disposed);

            Assert.IsFalse(work.PerformWork(1));
            item1.Cancel.Set();
            Assert.IsTrue(work.PerformWork(0, out signaled));
            Assert.IsTrue(ReferenceEquals(signaled, item1));
            Assert.IsTrue(item1.Completed);
            Assert.IsTrue(item1.Cancelled);
            Assert.IsTrue(item1.Disposed);

            Assert.IsTrue(work.IsEmpty);
            Assert.AreEqual(0, work.Count);
            Assert.IsFalse(work.PerformWork(1));
        }
Exemple #3
0
        private int InternalSend(int waitTime, IEnumerable <string> identities, string eventName, params string[] arguments)
        {
            int count = 0;

            using (WaitAndContinueList work = new WaitAndContinueList())
            {
                foreach (string identity in Check.NotNull(identities))
                {
                    IpcEventMessage m = new IpcEventMessage(this, ExecutionTimeout, identity, eventName, arguments);
                    if (!m.Completed)
                    {
                        work.AddWork(m);
                    }
                    else
                    {
                        count += m.Successful ? 1 : 0;
                    }
                }

                if (!work.IsEmpty)
                {
                    //Waiting while in-call results in dead-locks, so we force these to defer if they do not complete immediatly
                    if (InCall)
                    {
                        waitTime = 0;
                    }

                    System.Diagnostics.Stopwatch timer = new System.Diagnostics.Stopwatch();
                    if (waitTime > 0)
                    {
                        timer.Start();
                    }

                    IWaitAndContinue waitItem;
                    int ticksRemaining = waitTime;
                    while (work.PerformWork(ticksRemaining, out waitItem))
                    {
                        count += ((IpcEventMessage)waitItem).Successful ? 1 : 0;
                        if (waitTime > 0 && (ticksRemaining = (int)(waitTime - timer.ElapsedMilliseconds)) < 0)
                        {
                            break;
                        }
                    }

                    if (!work.IsEmpty)
                    {
                        WaitAndContinueWorker worker = _deferred;
                        if (worker != null)
                        {
                            try { worker.AddWork(work); } catch (ObjectDisposedException) { }
                        }
                    }
                }
            }
            return(count);
        }
Exemple #4
0
        public void TestCompletedEnqueue()
        {
            WaitAndContinueList work = new WaitAndContinueList();
            SampleWork          item = new SampleWork();

            item.Completed = true;
            Assert.IsFalse(item.Disposed);
            work.AddWork(item);
            Assert.IsTrue(work.IsEmpty);
            Assert.IsTrue(item.Disposed);
        }
Exemple #5
0
        public void TestAddWorkListToDisposedWorker()
        {
            WaitAndContinueWorker work = new WaitAndContinueWorker();

            work.Complete(false, 100);
            work.Dispose();

            WaitAndContinueList list = new WaitAndContinueList();

            list.AddWork(new SampleWork());

            work.AddWork(list);
        }
Exemple #6
0
        public void TestPerformDisposedWork()
        {
            WaitAndContinueList work = new WaitAndContinueList();
            SampleWork          item = new SampleWork();

            Assert.IsFalse(item.Disposed);
            work.AddWork(item);

            Assert.IsFalse(work.PerformWork(0));
            item.Dispose();

            Assert.IsFalse(work.PerformWork(0));

            item.Completed = true;//Normally this would be set in the Dispose method of the WorkItem, but we are testing
            Assert.IsFalse(work.PerformWork(0));

            Assert.IsTrue(work.IsEmpty);
            Assert.IsTrue(item.Disposed);
        }
Exemple #7
0
        public void TestPerformByAbandonMutex()
        {
            Mutex  abandondMutex = new Mutex();
            Thread t             = new Thread(delegate() { abandondMutex.WaitOne(); });

            t.Start();
            t.Join();

            WaitAndContinueList work = new WaitAndContinueList();
            SampleWork          item = new SampleWork();

            item.Mutex = abandondMutex;

            Assert.IsFalse(item.Disposed);
            work.AddWork(item);
            Assert.IsTrue(work.PerformWork(0));
            Assert.IsTrue(work.IsEmpty);
            Assert.IsTrue(item.Disposed);
            Assert.IsTrue(item.MutexAcquired);
        }
Exemple #8
0
        public void TestPerformWorkThrows()
        {
            WaitAndContinueList work = new WaitAndContinueList();
            SampleWork          item = new SampleWork();

            item.WorkThrows = true;
            work.AddWork(item);

            Assert.IsFalse(work.IsEmpty);
            Assert.IsFalse(work.PerformWork(1));
            item.Ready.Set();
            try
            {
                work.PerformWork(0);
                Assert.Fail("Expected exception.");
            }
            catch (ArgumentOutOfRangeException ae)
            {
                Assert.AreEqual("WorkThrows", ae.ParamName);
            }
            Assert.IsTrue(work.IsEmpty);
            Assert.IsTrue(item.Disposed);
            Assert.IsFalse(item.Completed); // incomplete, but still disposed... abandond due to exception.
        }