public void RetrieveUserGroups(UserModel user) { if (user == null) { throw new ArgumentNullException("user"); } if (userMapper.AreGroupsLoaded(user)) { return; } user.Groups.EnableSync(); Task.Factory.StartNew(() => { user.Groups.Clear(); var groups = repository.GetUserGroups(user.Name); var groupModels = groups.Select(g => groupMapper.GetModel(g, includeDummy: false)); var modelComparer = KeyComparer <GroupModel> .OrderBy(m => m.Name); foreach (GroupModel model in groupModels) { int index = user.Groups.ToSublist().UpperBound(model, modelComparer); user.Groups.Insert(index, model); } }).ContinueWith( t => onErrorOccurred(t.Exception), CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, TaskScheduler.FromCurrentSynchronizationContext() ); }