Example #1
0
        public void Dispose_Should_Try_ToStop_AllConsumers_Gracefully()
        {
            const int itemsTotal = 20;
            const int consumersTotal = 2;

            using (var countdownCompleted = new CountdownEvent(itemsTotal))
            using (var countdownAdd = new CountdownEvent(itemsTotal))
            {
                var target = new MockTaskPool(() => (k, i) =>
                {
                    Thread.Sleep(100);
                    countdownCompleted.Signal();
                },
                    (k, i) => { countdownAdd.Signal(); },
                    Assert.IsNull, consumersTotal, true);

                Assert.AreEqual(consumersTotal, target.PoolSize);

                Task.Factory.StartNew(() =>
                {
                    for (int i = 0; i < itemsTotal; i++)
                    {
                        target.Add(i, i);
                    }
                });
                Assert.IsTrue(countdownAdd.Wait(5000));
                target.Dispose();
                Assert.IsFalse(countdownCompleted.IsSet);
                Assert.IsTrue(countdownCompleted.Wait(5000));
            }
        }
Example #2
0
        private void Create_Add_AndWaitForCompletion(bool suspendWorkers)
        {
            const int itemsTotal = 20;
            const int consumersTotal = 20;
            using (var countdownConsumer = new CountdownEvent(itemsTotal))
            using (var countdownAdd = new CountdownEvent(itemsTotal))
            {
                using (var target = new MockTaskPool(() => (k, i) =>
                {
                    Assert.AreEqual(k, i);
                    countdownConsumer.Signal();
                },
                    (k, i) =>
                    {
                        Assert.AreEqual(k, i);
                        countdownAdd.Signal();
                    },
                    Assert.IsNull, consumersTotal, suspendWorkers, false, 1000))
                {
                    Assert.AreEqual(consumersTotal, target.PoolSize);

                    Task.Factory.StartNew(() =>
                    {
                        for (int i = 0; i < itemsTotal; i++)
                        {
                            target.Add(i, i);
                        }
                    });
                    Assert.IsTrue(SpinWaitHelper.SpinWaitForCondition(() => target.PendingRequests > 0, 1000));
                    Assert.IsTrue(countdownAdd.Wait(5000)); //should invoke add callback within timeout
                    Assert.IsTrue(countdownConsumer.Wait(5000)); //should invoke consumer within timeout

                    Assert.IsTrue(SpinWaitHelper.SpinWaitForCondition(() => target.IndexSize == itemsTotal, 1000));

                    Assert.IsTrue(SpinWaitHelper.SpinWaitForCondition(() => target.PoolSize == consumersTotal, 10000));

                    Assert.AreEqual(0, target.PendingRequests);
                }
            }
        }