private Task <IAssembly> LoadDependencyAsync( AssemblyLoadContext assemblyLoadContext, Dependency dependency, CancellationToken cancellationToken) { return (_assemblies.GetOrAdd( dependency, _ => new Lazy <Task <IAssembly> >(LoadDependencyAsyncInternal)) .Value); // Cannot return ValueTask since possible to await multiple times. async Task <IAssembly> LoadDependencyAsyncInternal() { var assemblyLoadResult = (await _assemblyLoaders .ToAsyncEnumerable() .SelectAwait(x => x.TryLoadAssemblyAsync( assemblyLoadContext, dependency, cancellationToken)) .FirstOrDefaultAsync(x => x != null) .ConfigureAwait(false)) ?? throw new FlcException( $"Could not find assembly {dependency.Name} {dependency.Version} in any location"); var subDependencies = await _dependencyAttributeReader .ReadDependencies(assemblyLoadResult.Assembly) .ToAsyncEnumerable() .SelectAwait(x => new ValueTask <IAssembly>( LoadDependencyAsync(assemblyLoadContext, x, cancellationToken))) .ToImmutableArrayAsync() .ConfigureAwait(false); return(_assemblyFactory.FromMetadata( assemblyLoadResult.Assembly, assemblyLoadResult.Bytes, subDependencies)); } }