Skip to content

Commit 233769d

Browse files
committed
Fixed laggy cancellation of compression and decompression tasks
1 parent 97afd5a commit 233769d

File tree

2 files changed

+25
-13
lines changed

2 files changed

+25
-13
lines changed

CompactGUI.Core/Compactor.vb

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,16 @@ Public Class Compactor : Implements IDisposable, ICompressor
4848

4949
Dim paraOptions As New ParallelOptions With {.MaxDegreeOfParallelism = MaxParallelism}
5050

51-
Await Parallel.ForEachAsync(workingFiles, paraOptions,
52-
Function(file, _ctx) As ValueTask
53-
If _ctx.IsCancellationRequested Then Return ValueTask.FromCanceled(_ctx)
54-
Return New ValueTask(PauseAndProcessFile(file, totalFilesSize, cancellationTokenSource.Token, progressMonitor))
55-
End Function).ConfigureAwait(False)
51+
Try
52+
Await Parallel.ForEachAsync(workingFiles, paraOptions,
53+
Function(file, _ctx) As ValueTask
54+
_ctx.ThrowIfCancellationRequested()
55+
Return New ValueTask(PauseAndProcessFile(file, totalFilesSize, cancellationTokenSource.Token, progressMonitor))
56+
End Function).ConfigureAwait(False)
57+
Catch ex As OperationCanceledException
58+
' Swallow cancellation, return false
59+
Return False
60+
End Try
5661

5762
Return Not cancellationTokenSource.IsCancellationRequested
5863

@@ -64,16 +69,17 @@ Public Class Compactor : Implements IDisposable, ICompressor
6469
Await pauseSemaphore.WaitAsync(_ctx).ConfigureAwait(False)
6570
pauseSemaphore.Release()
6671
Catch ex As OperationCanceledException
72+
Throw
6773
Return
6874
End Try
6975

70-
If _ctx.IsCancellationRequested Then Return
76+
_ctx.ThrowIfCancellationRequested()
7177

7278
Dim res = WOFCompressFile(details.FileName)
7379
Interlocked.Add(totalProcessedBytes, details.UncompressedSize)
74-
7580
progressMonitor?.Report(New CompressionProgress(totalProcessedBytes / totalFilesSize * 100, details.FileName))
7681

82+
7783
End Function
7884

7985

CompactGUI.Core/Uncompactor.vb

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,16 @@ Public Class Uncompactor : Implements ICompressor, IDisposable
1616
Dim paraOptions As New ParallelOptions With {.MaxDegreeOfParallelism = MaxParallelism}
1717

1818
_processedFileCount.Clear()
19-
Await Parallel.ForEachAsync(filesList, paraOptions,
20-
Function(file, _ctx) As ValueTask
21-
If _ctx.IsCancellationRequested Then Return ValueTask.FromCanceled(_ctx)
22-
Return New ValueTask(PauseAndProcessFile(file, totalFiles, _cancellationTokenSource.Token, progressMonitor))
23-
End Function).ConfigureAwait(False)
19+
Try
20+
Await Parallel.ForEachAsync(filesList, paraOptions,
21+
Function(file, _ctx) As ValueTask
22+
_ctx.ThrowIfCancellationRequested()
23+
Return New ValueTask(PauseAndProcessFile(file, totalFiles, _cancellationTokenSource.Token, progressMonitor))
24+
End Function).ConfigureAwait(False)
25+
Catch ex As OperationCanceledException
26+
Return False
27+
End Try
28+
2429
Return True
2530

2631
End Function
@@ -31,10 +36,11 @@ Public Class Uncompactor : Implements ICompressor, IDisposable
3136
Await _pauseSemaphore.WaitAsync(_ctx).ConfigureAwait(False)
3237
_pauseSemaphore.Release()
3338
Catch ex As OperationCanceledException
39+
Throw
3440
Return
3541
End Try
3642

37-
If _ctx.IsCancellationRequested Then Return
43+
_ctx.ThrowIfCancellationRequested()
3844

3945
Dim res = WOFDecompressFile(file)
4046
_processedFileCount.TryAdd(file, 1)

0 commit comments

Comments
 (0)