取消任务后代码未执行

问题描述 投票:0回答:1

我们将异步命令的执行绑定到导致任务的 ui。另一个命令取消了此任务,但它无法正常工作。

public class MainWindowViewModel : BaseViewModel
{
    private IAsyncCommand _runCancelableCommand;
    private ICommand _cancelCancelableCommand;

    CancellationTokenSource cancellationTokenSource = new CancellationTokenSource();

    public IAsyncCommand RunCancelableCommand => _runCancelableCommand ??= new AsyncCommand(OnRunCancelableCommand);

    public ICommand CancelCancelableCommand =>
           _cancelCancelableCommand ??= new DelegateCommand(OnCancelCancelableCommand);

    private void OnCancelCancelableCommand()
    {
        try
        {
            cancellationTokenSource.Cancel();
        }
        catch (Exception e)
        {

        }

        // this code here is never reached
    }

    private async Task OnRunCancelableCommand()
    {

        await loadingsomedata(..., cancellationTokenSource.Token);
    }
}

这确实有效,任务被正确取消。但调用 Cancel 之后的代码永远不会执行。谁能说说为什么。

c# wpf mvvm async-await cancellationtokensource
1个回答
0
投票

您尚未展示如何实际取消操作。因此,我们无法判断您的应用程序是否死锁或陷入无限循环等。

但是,从您处理异常的方式来看,我可以看出您误解了流程。异常是由实际执行取消的代码抛出的,即轮询

OperationCancelledException
,而不是由调用
CancellationToken
的代码抛出。
此外,一旦取消的 
CancellationTokenSource.Cancel
就无法重复使用。在可取消操作开始之前,必须将其处置并创建一个新实例。
以下示例展示了如何正确取消异步操作:

CancellationTokenSource

© www.soinside.com 2019 - 2024. All rights reserved.