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)); } }
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); } } }