コード例 #1
0
        public void Search(string searchTerm)
        {
            if (repository == null)
            {
                throw new InvalidOperationException("You must share the connection with the model before searching.");
            }
            if (Group == null)
            {
                throw new InvalidOperationException("You must set the group before searching.");
            }
            if (String.IsNullOrWhiteSpace(searchTerm))
            {
                return;
            }

            if (searchTokenSource != null)
            {
                searchTokenSource.Cancel();
            }
            searchTokenSource = new CancellationTokenSource();

            searchTask = searchTask.ContinueWith(
                t => { IsSearching = true; },
                searchTokenSource.Token,
                TaskContinuationOptions.None,
                TaskScheduler.FromCurrentSynchronizationContext()
                ).ContinueWith(t =>
            {
                var searchResults = repository.GetUsers(searchTerm, includeGroups: true);
                return(searchResults);
            }, searchTokenSource.Token).ContinueWith(t =>
            {
                CancellationToken token = searchTokenSource.Token;
                SearchResults.Clear();

                Group group       = repository.GetGroup(Group.Name);
                var searchResults = t.Result;
                var models        = searchResults.Select(m => userMapper.GetMemberModel(group.DistinguishedName, m));
                var modelComparer = KeyComparer <GroupMemberModel> .OrderBy(m => m.FullName).ThenBy(m => m.Name);
                foreach (var model in models)
                {
                    token.ThrowIfCancellationRequested();
                    int index = SearchResults.ToSublist().UpperBound(model, modelComparer);
                    SearchResults.Insert(index, model);
                }
            }, searchTokenSource.Token, TaskContinuationOptions.OnlyOnRanToCompletion, TaskScheduler.Default);
            searchTask.ContinueWith(
                t => onErrorOccurred(t.Exception),
                CancellationToken.None,
                TaskContinuationOptions.OnlyOnFaulted,
                TaskScheduler.FromCurrentSynchronizationContext()
                );
            searchTask.ContinueWith(
                t => { IsSearching = false; },
                searchTokenSource.Token,
                TaskContinuationOptions.None,
                TaskScheduler.FromCurrentSynchronizationContext()
                );
        }