/// <summary>
        ///   Attempts to remove marked package directories that were unable to be fully deleted
        ///   during the original uninstall.
        /// </summary>
        public async Task DeleteMarkedPackageDirectoriesAsync(INuGetProjectContext projectContext)
        {
            foreach (var directory in GetPackageDirectoriesMarkedForDeletion())
            {
                string    failedPath  = null;
                bool      isFailedDir = false;
                Exception failedEx    = null;

                if (await Task.Run(() => DeleteDirectoryRecursive(directory, out failedPath, out isFailedDir, out failedEx)))
                {
                    continue;
                }

                if (failedPath != null)
                {
                    var lockerMsg = string.Empty;
                    var lockers   = RestartManager.FindLockerProcesses(failedPath);

                    if (lockers.Length > 0)
                    {
                        lockerMsg =
                            $"\nThe {(isFailedDir ? "folder" : "file")} which threw an exception is locked by processes: {string.Join("; ", lockers.Select(l => l.strAppName))}";
                    }

                    LogTo.Warning(
                        $"Failed to deleted package directory marked for deletion: '{directory}'.\nDeleting {failedPath} threw an exception (see below).{lockerMsg}\n\n{failedEx}");
                }

                LogTo.Warning($"Failed to delete package directory marked for deletion: '{directory}'.");
            }
        }