public async Task <TaskResult <ResourceCompleterCheckResult?> > CheckAndDownloadTaskAsync() { _retryFiles.Clear(); if (!(ResourceInfoResolvers?.Any() ?? false)) { return(new TaskResult <ResourceCompleterCheckResult?>(TaskResultStatus.Success, value: null)); } var totalLostFiles = new List <IGameResource>(); foreach (var resolver in ResourceInfoResolvers) { resolver.GameResourceInfoResolveEvent += GameResourceInfoResolveStatus; await foreach (var lostFile in resolver.ResolveResourceAsync()) { totalLostFiles.Add(lostFile); } } if (!totalLostFiles.Any()) { return(new TaskResult <ResourceCompleterCheckResult?>(TaskResultStatus.Success, value: null)); } totalLostFiles.Shuffle(); NeedToDownload = totalLostFiles.Count; var downloadList = ( from f in totalLostFiles select new DownloadFile { Completed = WhenCompleted, DownloadPath = f.Path, DownloadUri = f.Uri, FileName = f.FileName, FileSize = f.FileSize, CheckSum = f.CheckSum, FileType = f.Type, TimeOut = 10000 }).ToList(); if (downloadList.First().FileType.Equals("GameJar", StringComparison.OrdinalIgnoreCase)) { downloadList.First().Changed = (_, args) => { DownloadFileCompletedEvent?.Invoke(this, new DownloadFileCompletedEventArgs(null, null, downloadList.First(), args.Speed)); }; } var(item1, item2) = await DownloadFiles(downloadList); return(new TaskResult <ResourceCompleterCheckResult?>(item1, value: item2)); }
private void WhenCompleted(object?sender, DownloadFileCompletedEventArgs e) { TotalDownloaded++; InvokeDownloadProgressChangedEvent((double)TotalDownloaded / NeedToDownload, e.AverageSpeed); DownloadFileCompletedEvent?.Invoke(this, e); if (!(e.Success ?? false)) { _retryFiles.Add(e.File); return; } if (!CheckFile) { return; } Check(e.File, ref _retryFiles); }