private async Task <DeferToken> GetMetadataFromRemoteSourcesAsync(DeferToken token, CancellationToken cancellationToken)
        {
            bool prerelease = _settignsProvider.Model.IsPreReleaseIncluded;

            var searchMetadata = await _packageMetadataProvider.GetPackageMetadataAsync(token.Package.Identity, prerelease, cancellationToken);

            token.Result = searchMetadata;

            return(token);
        }
#pragma warning disable CL0002 // Use async suffix
        private Task <DeferToken> CreateTaskFromToken(DeferToken token, CancellationToken cancellationToken)
        {
            bool prerelease = _settignsProvider.Model.IsPreReleaseIncluded;

            if (token.LoadType == MetadataOrigin.Installed)
            {
                //from local
                return(GetMetadataFromLocalSourcesAsync(token, cancellationToken));
            }

            return(GetMetadataFromRemoteSourcesAsync(token, cancellationToken));
        }
        /// <summary>
        /// Get installed local metadata based on package.config
        /// </summary>
        /// <param name="token"></param>
        /// <param name="cancellationToken"></param>
        /// <returns></returns>
        private async Task <DeferToken> GetMetadataFromLocalSourcesAsync(DeferToken token, CancellationToken cancellationToken)
        {
            var    project   = _projectProvider.GetDefaultProject();
            string packageId = token.Package.Identity.Id;

            if (project is null)
            {
                return(token);
            }

            var installedVersion = await _projectManager.GetVersionInstalledAsync(project, packageId, cancellationToken);

            if (installedVersion is null)
            {
                return(token);
            }

            var metadata = await _packageMetadataProvider.GetLocalPackageMetadataAsync(new PackageIdentity(packageId, installedVersion), true, cancellationToken);

            token.Result = metadata;

            return(token);
        }
        private async Task RunTaskExecutionLoopAsync()
        {
            try
            {
                var processedTask = _taskTokenList.ToList();
                _taskTokenList.Clear();

                _packageMetadataProvider = InitializeMetadataProvider();

                if (_packageMetadataProvider is null)
                {
                    Log.Info("Cannot acquire metadata provider for background loading tasks");
                    return;
                }

                using (var cts = new CancellationTokenSource())
                {
                    _aliveCancellationToken = cts.Token;

#pragma warning disable IDISP013 // Await in using.
                    var taskList = processedTask.ToDictionary(x => CreateTaskFromToken(x, _aliveCancellationToken));
#pragma warning restore IDISP013 // Await in using.

                    Log.Info($"Start updating {_taskTokenList.Count} items in background");

                    while (taskList.Any())
                    {
                        var nextCompletedTask = await Task.WhenAny(taskList.Keys);

                        PackageStatus          updateStateValue;
                        IPackageSearchMetadata result        = null;
                        DeferToken             executedToken = null;

                        try
                        {
                            executedToken = await nextCompletedTask;
                            result        = executedToken?.Result;
                        }
                        catch (Exception ex)
                        {
                            Log.Error(ex, "Package loading background task failed, cannot get result");
                        }
                        finally
                        {
                            taskList.Remove(nextCompletedTask);
                        }

                        if (result is not null)
                        {
                            updateStateValue = await NuGetPackageCombinator.CombineAsync(executedToken.Package, executedToken.LoadType, result);
                        }
                        else
                        {
                            updateStateValue = PackageStatus.NotInstalled;
                        }

                        executedToken?.UpdateAction(updateStateValue);
                    }
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Background loading task was failed");
            }
            finally
            {
                //todo try to complete all remaining tasks
                _isLoading = false;
            }
        }
 public void Add(DeferToken token)
 {
     _taskTokenList.Add(token);
 }