public void StressTest() { List <Dummy> originalList = Enumerable.Range(0, 10000).Select(x => new Dummy()).ToList(); var rnd = new Random(0); var checkHashSet = new HashSet <Dummy>( rnd.RandomUniqueSet(0, originalList.Count, originalList.Count / 2).Select(x => originalList[x])); var setToTest = new ProcessableSet <Dummy>(); foreach (Dummy dummy in checkHashSet) { setToTest.Add(dummy); } setToTest.ForEach( x => { if (rnd.NextDouble() < 0.3) { int itemIndex = rnd.Next(0, originalList.Count); Dummy testItem = originalList[itemIndex]; bool goodResult; bool testResult; if (rnd.NextBool()) { goodResult = checkHashSet.Add(testItem); testResult = setToTest.Add(testItem); testResult.Should().Be(goodResult, "Add operation wrong."); } else { goodResult = checkHashSet.Remove(testItem); testResult = setToTest.Remove(testItem); testResult.Should().Be(goodResult, "Remove operation wrong."); if (testResult) { // Forgetting that processed, if it was removed. testItem.ProcessedCount = 0; } } } x.ProcessedCount++; }); foreach (Dummy dummy in setToTest) { dummy.ProcessedCount.Should().Be(1, "Some element processed more than once."); } setToTest.Count.Should().Be(checkHashSet.Count); foreach (Dummy dummy in checkHashSet) { setToTest.Should().Contain(dummy); } }
/// <inheritdoc/> protected override void OnDisposeStarted() { // We are under tree lock here // --------------------------------------------------------- // This method is not reenterant. // --------------------------------------------------------- _locks.ForEach(x => x.PulseDispose()); if (Locks.All(x => x is IxInstanceChildLock)) { SetDisposeSuspended(false); } base.OnDisposeStarted(); }