public void CurrentReadCount_WhenInvokedInParallel_ShouldNotThrowLockingException(int totalOperations, int maxDegreeOfParallelism) { var readerWriterLockSlimOf = new ReaderWriterLockSlimOf <object>(); var options = new ParallelOptions { MaxDegreeOfParallelism = maxDegreeOfParallelism, }; var exceptions = new ConcurrentBag <Exception>(); var result = Parallel.For(0, totalOperations, options, state => { try { readerWriterLockSlimOf.Instance = state; var i1 = readerWriterLockSlimOf.Instance; var i2 = readerWriterLockSlimOf.Instance; var i3 = readerWriterLockSlimOf.Instance; var i4 = readerWriterLockSlimOf.Instance; var i5 = readerWriterLockSlimOf.Instance; var numReaders = readerWriterLockSlimOf.CurrentReadCount; readerWriterLockSlimOf.Instance = state; var i6 = readerWriterLockSlimOf.Instance; var i7 = readerWriterLockSlimOf.Instance; var i8 = readerWriterLockSlimOf.Instance; var i9 = readerWriterLockSlimOf.Instance; var i10 = readerWriterLockSlimOf.Instance; readerWriterLockSlimOf.Instance = state; } catch (Exception exc) { exceptions.Add(exc); } }); Assert.Empty(exceptions); Assert.True(result.IsCompleted); }
public void ShouldNotThrowLockingException() { var x = new ReaderWriterLockSlimOf <object>(); var options = new ParallelOptions { MaxDegreeOfParallelism = 25, }; var result = Parallel.For(0, 1000 * 1000, options, state => { x.Instance = state; var i1 = x.Instance; var i2 = x.Instance; var i3 = x.Instance; var i4 = x.Instance; var i5 = x.Instance; var numReaders = x.CurrentReadCount; if (numReaders > 1) { Console.WriteLine($"Num Readers: {numReaders}"); } x.Instance = state; var i6 = x.Instance; var i7 = x.Instance; var i8 = x.Instance; var i9 = x.Instance; var i10 = x.Instance; x.Instance = state; }); Console.WriteLine(x.Instance); result.IsCompleted.Should().BeTrue(); }