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)); }
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; })); }