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(); } }