File: System\IO\Pipelines\PipeCompletionCallbacks.cs
Web Access
Project: src\src\libraries\System.IO.Pipelines\src\System.IO.Pipelines.csproj (System.IO.Pipelines)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Collections.Generic;
using System.Runtime.ExceptionServices;
 
namespace System.IO.Pipelines
{
    internal sealed class PipeCompletionCallbacks
    {
        private readonly List<PipeCompletionCallback> _callbacks;
        private readonly Exception? _exception;
 
        public PipeCompletionCallbacks(List<PipeCompletionCallback> callbacks, ExceptionDispatchInfo? edi)
        {
            _callbacks = callbacks;
            _exception = edi?.SourceException;
        }
 
        public void Execute()
        {
            var count = _callbacks.Count;
            if (count == 0)
            {
                return;
            }
 
            List<Exception>? exceptions = null;
 
            for (int i = 0; i < count; i++)
            {
                var callback = _callbacks[i];
                Execute(callback, ref exceptions);
            }
 
            if (exceptions != null)
            {
                throw new AggregateException(exceptions);
            }
        }
 
        private void Execute(PipeCompletionCallback callback, ref List<Exception>? exceptions)
        {
            try
            {
                callback.Callback(_exception, callback.State);
            }
            catch (Exception ex)
            {
                exceptions ??= new List<Exception>();
                exceptions.Add(ex);
            }
        }
    }
}