示例#1
0
        public void RemoveThreadTest()
        {
            var resultingList = new ConcurrentBag <int>();
            var expectedList  = new List <int>();

            SetupTest((item) => { Thread.Sleep(1000); resultingList.Add(item); });

            using (threadCollection = new ThreadCollection(new SimpleThreadPoolSettings(2)))
            {
                var addResult = AddThreads(2);

                Assert.IsTrue(addResult);

                for (var i = 0; i < 2; i++)
                {
                    queue.Add(i);
                    expectedList.Add(i);
                    Thread.Sleep(500);
                }

                queue.CompleteAdding();

                // просим отменится второй поток, который сейчас работает
                var removeResult = threadCollection.TryRemoveThread();

                Assert.IsTrue(removeResult);
            }

            // если бы dispose не дождался тот второй отменённый поток, то в finalList не попал бы результат
            var finalList = new List <int>(resultingList);

            finalList.Sort();
            Assert.AreEqual(expectedList.Aggregate(string.Empty, (res, i) => res + i), finalList.Aggregate(string.Empty, (res, i) => res + i));
        }
示例#2
0
        public void CannotRemoveThreadTest()
        {
            var resultingList = new ConcurrentBag <int>();

            SetupTest((item) => { resultingList.Add(item); });

            using (threadCollection = new ThreadCollection(new SimpleThreadPoolSettings(1)))
            {
                var addResult = AddThreads(1);

                Assert.IsTrue(addResult);

                var removeResult = threadCollection.TryRemoveThread();

                queue.CompleteAdding();

                Assert.IsFalse(removeResult);
            }
        }