ReactiveUI:我是否应该使用TakeUntil()接收cancelToken.IsCancellationRequested

时间:2015-07-24 22:02:15

标签: reactiveui

我有两个简单的运行/取消命令

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永远不会成真。

提前致谢。

1 个答案:

答案 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命令运行时负责取消。