async Task DownloadProject(IPlayerClient client, Project project, string folder) { lock (m_ProgressLock) { m_Progress = 0.0f; } var storage = new PlayerStorage(folder, false, true); try { var manifestEntries = (await client.GetManifestsAsync()).ToArray(); onProgressChanged?.Invoke(0.0f); var total = manifestEntries.Length; var projectPercent = 1.0f / total; var localManifests = new Dictionary <string, SyncManifest>(); IEnumerable <SourceProject> localSourceProjects = null; try { localSourceProjects = storage.LoadProjectManifests(project).ToArray(); } catch (ReflectVersionException) { if (manifestEntries.Length == 0) { throw new Exception($"Cannot open project {project.name} because it has been exported with a different version of Unity Reflect."); } } if (localSourceProjects != null) { foreach (var sourceProject in localSourceProjects) { localManifests.Add(sourceProject.sourceId, sourceProject.manifest); } } storage.SaveProjectData(project); for (int i = 0; i < total; ++i) { var manifestEntry = manifestEntries[i]; localManifests.TryGetValue(manifestEntry.SourceId, out var oldManifest); await DownloadManifestDiff(client, oldManifest, manifestEntry.Manifest, project, manifestEntry.SourceId, storage); } } finally { client?.Dispose(); } lock (m_ProgressLock) { m_Progress = 1.0f; } }