public void DownloadDependencies() { Task.Run(async() => { if (await CheckLogin(1) < 0 || App.IsDownloading) { App.Window.Dispatcher.Invoke(() => { MainWindow.ScanRailworks.IsEnabled = true; MainWindow.SelectRailworksLocation.IsEnabled = true; MainWindow.DownloadMissing.IsEnabled = true; }); return; } int maxThreads = Math.Min(Environment.ProcessorCount, DownloadableDeps.Count); Parallel.For(0, maxThreads, workerId => { int max = DownloadableDeps.Count * (workerId + 1) / maxThreads; for (int i = DownloadableDeps.Count * workerId / maxThreads; i < max; i++) { Task.Run(async() => { string dependency = DownloadableDeps.ElementAt(i); List <int> pkgId = await FindFile(dependency); if (pkgId.Count >= 0) { lock (PkgsToDownload) { PkgsToDownload.UnionWith(pkgId); } } }).Wait(); } }); if (PkgsToDownload.Count > 0) { App.IsDownloading = true; MainWindow.Dispatcher.Invoke(() => { MainWindow.DownloadDialog.ShowAsync(); }); // TODO: Check if works MainWindow.DownloadDialog.DownloadPackages(PkgsToDownload, CachedPackages, InstalledPackages, WebWrapper, SqLiteAdapter).Wait(); App.IsDownloading = false; MainWindow.RW_CrawlingComplete(); } else { new Task(() => { App.Window.Dispatcher.Invoke(() => { MainWindow.ErrorDialog = new ContentDialog() { Title = "Cannot download packages", Content = "All availaible packages were downloaded.", SecondaryButtonText = "OK", Owner = App.Window }; MainWindow.ErrorDialog.ShowAsync(); }); MainWindow.Dispatcher.Invoke(() => { MainWindow.ScanRailworks.IsEnabled = true; MainWindow.SelectRailworksLocation.IsEnabled = true; }); }).Start(); } }); }
public async Task VerifyCache() { List <Package> localCache = SqLiteAdapter.LoadPackages(true); ServerVersions = new Dictionary <int, int>(); localCache.ForEach(x => ServerVersions[x.PackageId] = x.Version); Tuple <IEnumerable <Package>, HashSet <int> > tRemoteCache = await WebWrapper.ValidateCache(ServerVersions); IEnumerable <Package> remoteCache = tRemoteCache.Item1; HashSet <int> remoteVersions = tRemoteCache.Item2; lock (CachedPackages) { CachedPackages = remoteCache.ToList(); localCache.ForEach(x => { if (!remoteVersions.Contains(x.PackageId)) { CachedPackages.Add(x); } else { ServerVersions[x.PackageId] = CachedPackages.First(y => y.PackageId == x.PackageId).Version; } }); foreach (Package pkg in remoteCache) { ServerVersions[pkg.PackageId] = pkg.Version; } } if (remoteVersions.Count > 0) { new Task(() => { foreach (Package pkg in CachedPackages) { SqLiteAdapter.SavePackage(pkg, true); } SqLiteAdapter.FlushToFile(true); }).Start(); } CachedPackages.ForEach(x => { if (x.IsPaid) { x.FilesContained.ForEach(y => { DownloadablePaidDepsPackages[y] = x.PackageId; DownloadablePaidDeps.Add(y); }); } else { x.FilesContained.ForEach(y => { DownloadableDepsPackages[y] = x.PackageId; DownloadableDeps.Add(y); }); } }); }