执行命令直到另一个命令完成

时间:2018-05-26 20:40:36

标签: c# reactiveui

我有这样的事情:

this.WhenAnyValue(x => x.SearchText)
    .Where(text => !string.IsNullOrempty(text))
    .Throttle(TimeSpan.FromSeconds(0.25))
    .InvokeCommand(searchCmd);

其中SearchText是绑定到文本框的字符串属性,而searchCmd是ReactiveCommand。

我想要的是,如果searchCmd已在运行,则observable应该等待。例如,如果用户键入“gener”并在小暂停后键入“ally”,则命令仍将继续运行,并且不会执行“一般”,只执行“gener”。

有什么想法吗?

编辑:我正在做什么(它看起来有效):

首先我添加了OAPH:

readonly ObservableAsPropertyHelper<bool> isCmdRunning;

和一个财产:

public bool IsCmdRunning => isCmdRunning.Value;

然后,在cosntructor中:

this.searchCmd.IsExecuting
    .ToProperty(this, x => x.IsCmdRunning, out isCmdRunning);

最后:

this.WhenAnyValue(x => x.SearchText, x => x.IsCmdRunning, (search, running) => new {Search = search, Running = running})
    .Where(value => !string.IsNullOrempty(value.Search) && !value.Running)
    .Throttle(TimeSpan.FromSeconds(0.25))
    .Select(value => value.Search)
    .InvokeCommand(searchCmd);

但我不知道是否有更好的方法。

1 个答案:

答案 0 :(得分:0)

我认为使用CancellationToken是一个很好的解决方案。

搜索命令:

Search = ReactiveCommand.CreateFromObservable(
    () => Observable
        .StartAsync(ct => SearchImpl(ct))
        .TakeUntil(CancelSearch));

CancelSearch命令:

CancelSearch = Command.Create(() => {}, Search.IsExecuting);

最后:

this.WhenAnyValue(x => x.SearchText)
    .Do(_ => Observable.Return(Unit.Default).InvokeCommand(CancelSearch))
    .Throttle(TimeSpan.FromSeconds(0.25))
    .InvokeCommand(searchCmd);