示例#1
0
        async Task OnSearch()
        {
            OnCancelSearch();

            Results                 = null;
            ResultsTime             = "Running..";
            cancellationTokenSource = new CancellationTokenSource();
            CancelSearch.RaiseCanExecuteChanged();

            serviceLocator.Get <INavigationService>()
            .NavigateAsync(AppPages.Results, this).IgnoreResult();

            ConcurrentBag <TrackViewModel> foundTracks = new ConcurrentBag <TrackViewModel>();

            int            numConsumers = NumberOfConsumers;
            MusicProcessor processor    = new MusicProcessor(numConsumers,
                                                             t => SearchCriteria.All(sc => sc.Test(t)),
                                                             t => foundTracks.Add(new TrackViewModel(t)));

            Stopwatch sw = Stopwatch.StartNew();

            try
            {
                await processor.Start(cancellationTokenSource.Token);
            }
            catch (OperationCanceledException)
            {
            }
            finally
            {
                sw.Stop();

                ResultsTime = string.Format("{0} consumer took {1} for {2} records.",
                                            numConsumers, sw.Elapsed, foundTracks.Count);
                Results = foundTracks.Distinct().OrderBy(t => t.Index).ToList();
                cancellationTokenSource = null;
                CancelSearch.RaiseCanExecuteChanged();
            }
        }