コード例 #1
0
        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);
        }
コード例 #2
0
        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);
        }