Пример #1
0
        private async Task QuickDeleteDeltaFilesAsync(IProgress <DeletionProgressReportModel> progress, CancellationToken cancellationToken)
        {
            object sync = new object();

            DeletionProgressReportModel progressReport = new DeletionProgressReportModel(MyDeltaFiles.Count);
            ParallelOptions             po             = new ParallelOptions();

            po.CancellationToken      = cancellationToken;
            po.MaxDegreeOfParallelism = System.Environment.ProcessorCount;

            await Task.Run(() =>
            {
                Parallel.ForEach <FileDescriptorModel>(MyDeltaFiles, po, (fd) =>
                {
                    DeleteSingleDeltaFile(fd);
                    lock (sync)
                    {
                        progressReport.DeletedFilesNo++;
                        // We cannot remove MyDeltaFiles list elements - because List type isn't thread safe
                        // But somehow we can add to the list in the progress report (that's what Tim Corey does, and it works for him...)
                        // We have to do this in order to remove deleted files from the MyDeltaFiles list after the parallel loop finishes.
                        SessionDeletedFiles.Add(fd);

                        progress.Report(progressReport);
                    }
                    po.CancellationToken.ThrowIfCancellationRequested();
                });
            });

            return;
        }
Пример #2
0
        private async Task DeleteDeltaFilesAsync(IProgress <DeletionProgressReportModel> progress, CancellationToken cancellationToken)
        {
            DeletionProgressReportModel progressReport = new DeletionProgressReportModel(MyDeltaFiles.Count);
            bool ContinueAsking = true;

            List <FileDescriptorModel> IterationListCopy = new List <FileDescriptorModel>();

            for (int i = MyDeltaFiles.Count - 1; i >= 0; i--)
            {
                var fd = MyDeltaFiles[i];
                if (ContinueAsking)
                {
                    // ask user to confirm deletion in modal message box, by checking the returned result (Cancel, Skip, Delete, Delete All)
                    MessageBoxResult result = WWMessageBox.ShowOKYesNoCancel($"Confirm deletion of the file:\n{ fd.FullName }", "User decision required", "Delete All", "Delete this one", "Skip", "Cancel", MessageBoxImage.Question);
                    switch (result)
                    {
                    case MessageBoxResult.OK:
                        ContinueAsking = false;
                        break;

                    case MessageBoxResult.Yes:
                        break;

                    case MessageBoxResult.No:
                        continue;

                    case MessageBoxResult.Cancel:
                        return;

                    default:
                        break;
                    }
                }

                await Task.Run(() => DeleteSingleDeltaFile(fd));

                progressReport.DeletedFilesNo++;
                progressReport.CurrentFd = fd;

                progress.Report(progressReport);
                cancellationToken.ThrowIfCancellationRequested();
            }

            return;
        }
Пример #3
0
        private void ProgressReportedEventHandler(object sender, DeletionProgressReportModel e)
        {
            MyDeletedFilesNo   = e.DeletedFilesNo;
            MyDeletionProgress = e.DeletionProgress;
            OnPropertyRaised("MyDeletionProgress");

            if (e.CurrentFd != null)
            {
                // Do this only when deletion is a single-threaded sequential operation (non-parallel)
                if (MyDeltaFiles.Contains(e.CurrentFd))
                {
                    MyDeltaFiles.Remove(e.CurrentFd);
                    MyDeltaFilesView.Refresh();

                    QualifiedRawNo--;

                    OnPropertyRaised("MyDeltaFilesNo");
                    OnPropertyRaised("MyRejectionRatio");
                }
            }
        }