private List <Task> CreateTaskPackage(List <String> filesNeedRetrieval, String basePath, MusicIdentificationRetriever retriever, List <Ares.Tags.FileIdentification> retrievedInfo, Ares.ModelInfo.IProgressMonitor progressMon, int packageIndex, int packageSize) { List <Task> subTasks = new List <Task>(); for (int i = 0; i < packageSize; ++i) { int fileIndex = packageIndex * packageSize + i; if (fileIndex >= filesNeedRetrieval.Count) { break; } String path = System.IO.Path.Combine(basePath, filesNeedRetrieval[fileIndex]); var task2 = Task.Factory.StartNew(() => { retriever.RetrieveFileInfo(path, retrievedInfo[fileIndex], progressMon); }, m_Token); subTasks.Add(task2); } return(subTasks); }
private Task <int> DoUpdateAsync(IList <String> files, String musicDirectory) { m_Monitor.IncreaseProgress(0.0); int countWithId = 0; IList <Ares.Tags.FileIdentification> identification = Ares.Tags.TagsModule.GetTagsDB().ReadInterface.GetIdentificationForFiles(files); List <Ares.Tags.FileIdentification> retrievedInfo = new List <Tags.FileIdentification>(); List <Ares.Tags.FileIdentification> needsRetrieval = new List <Tags.FileIdentification>(); List <String> filesNeedRetrieval = new List <string>(); for (int i = 0; i < files.Count; ++i) { if (files[i].EndsWith(".m3u", StringComparison.OrdinalIgnoreCase)) { continue; } if (files[i].EndsWith(".m3u8", StringComparison.OrdinalIgnoreCase)) { continue; } if (NeedsRetrieval(identification[i])) { retrievedInfo.Add(identification[i]); filesNeedRetrieval.Add(files[i]); } else { ++countWithId; } } int nrOfRetrievals = filesNeedRetrieval.Count; if (nrOfRetrievals == 0) { return(Task.Factory.StartNew(() => { return countWithId; })); } String basePath = musicDirectory; MusicIdentificationRetriever retriever = new MusicIdentificationRetriever(m_Token); List <Task> tasks = new List <Task>(); m_Monitor.IncreaseProgress(5); SequentialProgressMonitor seqMon = new SequentialProgressMonitor(m_Monitor, 5.0, 95.0); ParallelProgressMonitor parallelMon = new ParallelProgressMonitor(seqMon, 100.0, filesNeedRetrieval.Count); // use packages of 30 files to reduce system load const int PACKAGE_SIZE = 30; int subTaskCount = (filesNeedRetrieval.Count + PACKAGE_SIZE - 1) / PACKAGE_SIZE; var task = Task.Factory.StartNew(() => { for (int t = 0; t < subTaskCount; ++t) { List <Task> subTasks = CreateTaskPackage(filesNeedRetrieval, basePath, retriever, retrievedInfo, parallelMon, t, PACKAGE_SIZE); Task.WaitAll(subTasks.ToArray()); List <String> retrievedFiles = new List <String>(); List <Ares.Tags.FileIdentification> retrievedInfo2 = new List <Tags.FileIdentification>(); for (int i = 0; i < PACKAGE_SIZE; ++i) { int fileIndex = t * PACKAGE_SIZE + i; if (fileIndex >= filesNeedRetrieval.Count) { break; } retrievedFiles.Add(filesNeedRetrieval[fileIndex]); retrievedInfo2.Add(retrievedInfo[fileIndex]); if (!String.IsNullOrEmpty(retrievedInfo[fileIndex].AcoustId)) { ++countWithId; } } Ares.Tags.TagsModule.GetTagsDB().WriteInterface.SetFileIdentifications(retrievedFiles, retrievedInfo2); subTasks = null; retrievedFiles = null; retrievedInfo2 = null; System.GC.Collect(); } retriever.Dispose(); return(countWithId); }, m_Token); return(task); }