Beispiel #1
0
        private IPackageFeedSearchJob <IPackageInfo> Compute(string packageId, string version, string tfm)
        {
            IPackageQueryConfiguration config = new PackageQueryConfiguration(tfm);
            List <Tuple <string, Task <IReadOnlyList <IPackageInfo> > > > searchTasks = new List <Tuple <string, Task <IReadOnlyList <IPackageInfo> > > >();
            CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();
            CancellationToken       cancellationToken       = cancellationTokenSource.Token;

            foreach (string feedSource in _feedRegistry.ConfiguredFeeds)
            {
                IPackageFeed feed = _factorySelector.GetFeed(feedSource);

                if (feed != null)
                {
                    searchTasks.Add(Tuple.Create(feedSource, feed.GetPackageInfoAsync(packageId, version, config, cancellationToken).ContinueWith(x =>
                    {
                        if (x == null || x.IsFaulted || x.IsCanceled)
                        {
                            return(new IPackageInfo[0]);
                        }

                        return((IReadOnlyList <IPackageInfo>) new[] { x.Result });
                    })));
                }
            }

            return(new PackageFeedSearchJob <IPackageInfo>(searchTasks, cancellationTokenSource));
        }
Beispiel #2
0
        public IPackageFeedSearchJob <Tuple <string, FeedKind> > SearchPackageNames(string prefix, string tfm)
        {
            PackageQueryConfiguration config = new PackageQueryConfiguration(tfm);

            var bag = _cachedNameSearches.GetOrAdd(config, x => new ConcurrentDictionary <PackageNameQuery, IPackageFeedSearchJob <Tuple <string, FeedKind> > >());

            return(bag.AddOrUpdate(new PackageNameQuery(prefix, tfm), x => SearchPackageNamesInternal(prefix, tfm, config), (x, e) =>
            {
                if (e.IsCancelled)
                {
                    return SearchPackageNamesInternal(prefix, tfm, config);
                }

                return e;
            }));
        }