public void CreateShelveset(bool force = false)
        {
            try
            {
                if (ProjectCollectionUri == null)
                {
                    return;
                }
                var teamProjectCollection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(ProjectCollectionUri);
                teamProjectCollection.Credentials = CredentialCache.DefaultNetworkCredentials;
                teamProjectCollection.EnsureAuthenticated();

                var service = (VersionControlServer)teamProjectCollection.GetService(typeof(VersionControlServer));
                var infos   = new AutoShelveInfos(this);
                foreach (var workspaceInfo in Workstation.Current.GetAllLocalWorkspaceInfo())
                {
                    if (workspaceInfo.MappedPaths.Length <= 0 || !workspaceInfo.ServerUri.Equals(ProjectCollectionUri))
                    {
                        continue;
                    }

                    Task.Run(() =>
                    {
                        var result = CreateShelvesetInternal(service, workspaceInfo, infos, force);
                        if (!result.IsSuccess)
                        {
                            InvalidateConnection(); // Force re-init on next attempt
                        }
                        ShelvesetCreated?.Invoke(this, result);
                    });
                }
            }
            catch (Exception ex)
            {
                InvalidateConnection(); // Force re-init on next attempt
                TfsShelvesetErrorReceived?.Invoke(this, new TfsShelvesetErrorEventArgs(error: ex));
            }
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="service"></param>
        /// <param name="infos"></param>
        /// <param name="workspaceInfo"></param>
        /// <param name="force">True when the user manually initiates a ShelveSet via the Team menu or mapped shortcut key.</param>
        private static ShelvesetCreatedEventArgs CreateShelvesetInternal(VersionControlServer service, WorkspaceInfo workspaceInfo, AutoShelveInfos infos, bool force)
        {
            var shelvesetName        = default(string);
            var shelvesetChangeCount = 0;
            var shelvesetPurgeCount  = 0;
            var error = default(Exception);

            try
            {
                var workspace = service.GetWorkspace(workspaceInfo);

                // Build a new, valid shelve set name
                shelvesetName = string.Format(infos.ShelvesetName, workspace.Name, workspace.OwnerName, DateTime.Now, workspace.OwnerName.GetDomain(), workspace.OwnerName.GetLogin());
                shelvesetName = shelvesetName.CleanShelvesetName();

                // If there are no pending changes that have changed since the last shelveset then there is nothing to do
                var hasChanges     = force;
                var pendingChanges = workspace.GetPendingChanges();
                var numPending     = pendingChanges.Length;

                if (numPending > 0)
                {
                    var pastShelvesets = GetPastShelvesets(service, workspace, infos.ShelvesetName);

                    if (!force)
                    {
                        var lastShelveset = pastShelvesets.FirstOrDefault();
                        if (lastShelveset == null)
                        {
                            // If there are pending changes and no shelveset yet exists, then create shelveset.
                            hasChanges = true;
                        }
                        else
                        {
                            // Compare numPending to shelvedChanges.Count();  Force shelveset if they differ
                            // Otherwise, resort to comparing file HashValues
                            var shelvedChanges = service.QueryShelvedChanges(lastShelveset).FirstOrDefault();
                            hasChanges = (shelvedChanges == null ||
                                          numPending != shelvedChanges.PendingChanges.Length) ||
                                         pendingChanges.DifferFrom(shelvedChanges.PendingChanges);
                        }
                    }

                    if (hasChanges)
                    {
                        shelvesetChangeCount = numPending;

                        // Actually create a new Shelveset
                        var shelveset = new Shelveset(service, shelvesetName, workspace.OwnerName)
                        {
                            Comment = string.Format(Resources.ShelvesetComment, VsExtAutoShelvePackage.ExtensionName, numPending)
                        };
                        workspace.Shelve(shelveset, pendingChanges, ShelvingOptions.Replace);

                        // Clean up past Shelvesets
                        if (infos.MaximumShelvesets > 0)
                        {
                            foreach (var set in pastShelvesets.Skip(infos.MaximumShelvesets))
                            {
                                service.DeleteShelveset(set);
                                shelvesetPurgeCount++;
                            }
                        }
                    }
                }
            }
            catch (Exception ex)
            {
                error = ex;
            }

            // Build event args for notification create shelveset result
            return(new ShelvesetCreatedEventArgs(
                       shelvesetName: shelvesetName,
                       shelvesetChangeCount: shelvesetChangeCount,
                       shelvesetPurgeCount: shelvesetPurgeCount,
                       error: error));
        }