public async Task<IEnumerable<IMediaFile>> StartSearchAsync(StringCollection filesOrDirsCollection) { this.IsWorking = true; // create the cancellation token source this.cancelToken = new CancellationTokenSource(); // create the cancellation token var token = this.cancelToken.Token; this.mainTask = Task<IEnumerable<IMediaFile>>.Factory .StartNew(() => { var results = new ConcurrentQueue<IMediaFile>(); // get audio files from input collection var rawFiles = filesOrDirsCollection.OfType<string>().Where(this.IsAudioFile).OrderBy(s => s).ToList(); foreach (var rawFile in rawFiles.TakeWhile(rawDir => !token.IsCancellationRequested)) { var mf = this.GetMediaFile(rawFile); if (mf != null) { results.Enqueue(mf); } } // handle all directories from input collection var directories = new List<string>(); foreach (var source in filesOrDirsCollection.OfType<string>().Except(rawFiles).Where(IsDirectory).TakeWhile(source => !token.IsCancellationRequested)) { directories.Add(source); try { directories.AddRange(Directory.EnumerateDirectories(source, "*", SearchOption.AllDirectories).TakeWhile(dir => !token.IsCancellationRequested)); } catch (Exception e) { // System.UnauthorizedAccessException Console.WriteLine(e); } } foreach (var rawDir in directories.Distinct().OrderBy(s => s).TakeWhile(rawDir => !token.IsCancellationRequested)) { this.doFindFiles(token, rawDir, results); } return results; }, token, TaskCreationOptions.LongRunning, TaskScheduler.Current); var mediaFiles = await this.mainTask; this.IsWorking = false; return mediaFiles; }
internal XmlSchema GetQuerySchema() { var schema = new XmlSchema {TargetNamespace = QuerySpace}; schema.Namespaces.Add("", QuerySpace); var allParameters = new StringCollection(); foreach (var queriesForResourceType in _baseQueries.GroupBy(k => k.ResourceKey) .Where(k=>_registrationStorage.IsResourceRegistered(k.Key))) { var group = new XmlSchemaAttributeGroup(); group.Name = _registrationStorage[queriesForResourceType.Key].ResourceName.Replace(" ", "_"); var parameters = queriesForResourceType.SelectMany(k => k.Arguments) .Distinct(_parameterComparer) .ToArray(); allParameters.AddRange(parameters); foreach (var attr in parameters.Select(k => new XmlSchemaAttribute { RefName = new XmlQualifiedName(k, QuerySpace) })) { group.Attributes.Add(attr); } schema.Items.Add(group); } foreach(var attr in allParameters.OfType<string>().Distinct().Select( k => new XmlSchemaAttribute { Name = k, SchemaType = XmlSchemaType.GetBuiltInSimpleType(XmlTypeCode.String) })) { schema.Items.Add(attr); } return schema; }