Skip to content

Commit 9cfc518

Browse files
authored
Correctly cancel ProcessOperationQueue (#8187)
1 parent b09235c commit 9cfc518

File tree

1 file changed

+10
-12
lines changed

1 file changed

+10
-12
lines changed

src/Files/ViewModels/ItemViewModel.cs

Lines changed: 10 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ public class ItemViewModel : ObservableObject, IDisposable
5151
private readonly ConcurrentQueue<(uint Action, string FileName)> operationQueue;
5252
private readonly ConcurrentDictionary<string, bool> itemLoadQueue;
5353
private readonly AsyncManualResetEvent operationEvent;
54-
private IAsyncAction aProcessQueueAction;
54+
private Task aProcessQueueAction;
5555

5656
// files and folders list for manipulating
5757
private List<ListedItem> filesAndFolders;
@@ -1338,12 +1338,7 @@ private void AssignDefaultIcons()
13381338

13391339
public void CloseWatcher()
13401340
{
1341-
if (aProcessQueueAction != null)
1342-
{
1343-
aProcessQueueAction?.Cancel();
1344-
aProcessQueueAction = null; // Prevent duplicate execution of this block
1345-
Debug.WriteLine("process queue canceled");
1346-
}
1341+
aProcessQueueAction = null;
13471342
watcherCTS?.Cancel();
13481343
watcherCTS = new CancellationTokenSource();
13491344
}
@@ -1794,7 +1789,7 @@ private void WatchForDirectoryChanges(string path, CloudDriveSyncStatus syncStat
17941789

17951790
if (aProcessQueueAction == null) // Only start one ProcessOperationQueue
17961791
{
1797-
aProcessQueueAction = Windows.System.Threading.ThreadPool.RunAsync((x) => ProcessOperationQueue(x, hasSyncStatus));
1792+
aProcessQueueAction = Task.Run(() => ProcessOperationQueue(watcherCTS.Token, hasSyncStatus));
17981793
}
17991794

18001795
var aWatcherAction = Windows.System.Threading.ThreadPool.RunAsync((x) =>
@@ -1893,7 +1888,7 @@ private void WatchForDirectoryChanges(string path, CloudDriveSyncStatus syncStat
18931888
});
18941889
}
18951890

1896-
private async void ProcessOperationQueue(IAsyncAction action, bool hasSyncStatus)
1891+
private async Task ProcessOperationQueue(CancellationToken cancellationToken, bool hasSyncStatus)
18971892
{
18981893
ApplicationDataContainer localSettings = ApplicationData.Current.LocalSettings;
18991894
string returnformat = Enum.Parse<TimeStyle>(localSettings.Values[Constants.LocalSettings.DateTimeFormat].ToString()) == TimeStyle.Application ? "D" : "g";
@@ -1910,18 +1905,19 @@ private async void ProcessOperationQueue(IAsyncAction action, bool hasSyncStatus
19101905

19111906
bool anyEdits = false;
19121907
ListedItem lastItemAdded = null;
1908+
var rand = Guid.NewGuid();
19131909

19141910
try
19151911
{
1916-
while (action.Status != AsyncStatus.Canceled)
1912+
while (!cancellationToken.IsCancellationRequested)
19171913
{
1918-
if (await operationEvent.WaitAsync(200))
1914+
if (await operationEvent.WaitAsync(200, cancellationToken))
19191915
{
19201916
operationEvent.Reset();
19211917

19221918
while (operationQueue.TryDequeue(out var operation))
19231919
{
1924-
if (action.Status == AsyncStatus.Canceled) break;
1920+
if (cancellationToken.IsCancellationRequested) break;
19251921
try
19261922
{
19271923
switch (operation.Action)
@@ -2007,6 +2003,8 @@ private async void ProcessOperationQueue(IAsyncAction action, bool hasSyncStatus
20072003
{
20082004
// Prevent disposed cancellation token
20092005
}
2006+
2007+
Debug.WriteLine("aProcessQueueAction done: {0}", rand);
20102008
}
20112009

20122010
public ListedItem AddFileOrFolderFromShellFile(ShellFileItem item, string dateReturnFormat = null)

0 commit comments

Comments
 (0)