public async Task ReportsExceptionsWithReferenceTypes() { var inputValues = AsyncEnumerableProvider.GetObjects(100); Func <DummyClass, Task <DummyClass> > action = async(DummyClass input) => { await Task.Delay(10); if (input.MyInt % 10 == 0) { throw new Exception("We don't like 10s"); } return(new DummyClass(input.MyInt * 2)); }; var results = new ConcurrentBag <Result <DummyClass, DummyClass> >(); await foreach (var result in inputValues.SafeParallelAsyncWithResult(action)) { results.Add(result); } results.Count().ShouldBe(100); results.Count(r => r.Success).ShouldBe(90); results.Count(r => !r.Success).ShouldBe(10); results.First(r => !r.Success).Exception.ShouldNotBeNull(); results.First(r => !r.Success).Exception.Message.ShouldBe("We don't like 10s"); results.Select(r => r.Input.MyInt).ShouldBe(Enumerable.Range(1, 100), true); results.First(r => !r.Success).Output.ShouldBe(null); }
public async Task HandlesReferenceTypes() { var inputValues = AsyncEnumerableProvider.GetObjects(100); var expected = Enumerable.Range(1, 100).Sum(i => i * 2); int actual = 0; Func <DummyClass, Task <DummyClass> > action = async(DummyClass input) => { await Task.Delay(10); return(new DummyClass(input.MyInt * 2)); }; await foreach (var result in inputValues.SafeParallelAsyncWithResult(action)) { actual += result.Output.MyInt; } actual.ShouldBe(expected); }