我有两个简单的运行/取消命令
Run = ReactiveCommand.CreateAsyncTask(x => RunImpl());
Run.ThrownExceptions.Subscribe(ex => UserError.Throw(ex.Message, ex));
Cancel = this.WhenAnyObservable(x => x.Run.IsExecuting).ToCommand();
Run.TakeUntil(Cancel);
执行取消时,我是否应该期望在我的异步方法中发出取消令牌?
private async Task<bool> RunImpl(CancellationToken cancellationToken = default(CancellationToken))
{
//some stuffs
if (cancellationToken.IsCancellationRequested)
return;
//next stuffs
}
如果是这样,我做错了什么?因为IsCancellationRequest永远不会成真。
提前致谢。
答案 0 :(得分:1)
Run.TakeUntil(Cancel);
这没有任何效果,因为它只会创建一个永远不会被使用的新的observable。
Run = ReactiveCommand.CreateAsyncTask(x => RunImpl());
这将提供默认(从未使用过)的cancellationToken,因此永远不会取消。
我认为正确的方法是:
Run = ReactiveCommand.CreateAsyncObservable(_ => Observable.StartAsync(RunImpl).TakeUntil(Cancel));
Cancel = this.WhenAnyObservable(x => x.Run.IsExecuting).ToCommand();
这样,TakeUntil
返回的observable将在执行时被命令占用,TakeUntil
将在Cancel
命令运行时负责取消。