我们将异步命令的执行绑定到导致任务的 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 之后的代码永远不会执行。谁能说说为什么。
您尚未展示如何实际取消操作。因此,我们无法判断您的应用程序是否死锁或陷入无限循环等。
但是,从您处理异常的方式来看,我可以看出您误解了流程。异常是由实际执行取消的代码抛出的,即轮询
OperationCancelledException
,而不是由调用 CancellationToken
的代码抛出。此外,一旦取消的
CancellationTokenSource.Cancel
CancellationTokenSource