Store Parallel.ForEachAsync exceptions from cancellation callbacks (#82434)
authorStephen Toub <stoub@microsoft.com>
Thu, 2 Mar 2023 19:28:06 +0000 (14:28 -0500)
committerGitHub <noreply@github.com>
Thu, 2 Mar 2023 19:28:06 +0000 (14:28 -0500)
commit6006ad33189b0f892ae20f7d716f81b819174fb1
tree89fcb117f65f09a7c1e0b0959ef7d08da4587185
parentbc6c7339f9a45cfdf15a5a2e941b9b4694c75589
Store Parallel.ForEachAsync exceptions from cancellation callbacks (#82434)

* Store Parallel.ForEachAsync exceptions from cancellation callbacks

If a cancellation callback erroneously throws an exception, make sure we store it into the list of exceptions used to complete the resulting task. In most cases, this just means we may not be returning _all_ exceptions when there are multiple.  If, however, disposal of the enumerator throws an exception and a cancellation callback throws an exception and no exceptions were thrown from the loop body, without this change the task returned from ForEachAsync likely won't be marked completed.

* Update src/libraries/System.Threading.Tasks.Parallel/tests/ParallelForEachAsyncTests.cs
src/libraries/System.Threading.Tasks.Parallel/src/System/Threading/Tasks/Parallel.ForEachAsync.cs
src/libraries/System.Threading.Tasks.Parallel/tests/ParallelForEachAsyncTests.cs