private static async Task ForEachCore <T>( this IAsyncEnumerator <T> enumerator, Func <AsyncLoopContext <T>, Task> enumerationAction ) { if (enumerationAction == null) { throw new ArgumentNullException("enumerationAction"); } var index = 0L; var loopState = new AsyncLoopContext <T>(); ExceptionDispatchInfo edi = null; try { while (await enumerator.MoveNext().ConfigureAwait(false)) { loopState.Item = enumerator.Current; loopState.Index = index; try { await enumerationAction(loopState).ConfigureAwait(false); } catch (Exception e) { edi = ExceptionDispatchInfo.Capture(e); break; } if (loopState.WasBreakCalled) { break; } index++; } } finally { await enumerator.DisposeAsync(edi?.SourceException); } edi?.Throw(); }
public static async Task ForEach <T>(this IAsyncEnumerable <T> enumerable, Func <AsyncLoopContext <T>, Task> enumerationAction) { if (enumerable == null) { throw new ArgumentNullException("enumerable"); } if (enumerationAction == null) { throw new ArgumentNullException("enumerationAction"); } var index = 0L; var doContinue = true; var enumerator = enumerable.GetEnumerator(); var loopState = new AsyncLoopContext <T>(); try { while (doContinue) { doContinue = await enumerator.MoveNext().ConfigureAwait(false); if (doContinue) { loopState.Item = enumerator.Current; loopState.Index = index; await enumerationAction(loopState).ConfigureAwait(false); if (loopState.WasBreakCalled) { break; } index++; } } } finally { enumerator.Dispose(); } }