c# - 执行一个命令直到另一个命令完成

标签 c# reactiveui

我有这样的东西:

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

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

我想要的是,如果 searchCmd 已经在运行,则 observable 应该等待。例如,如果用户键入“gener”,稍停片刻后键入“ally”,该命令将仍在运行,并且不会执行“generally”,只会执行“gener”。

有什么想法吗?

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

首先我添加了一个 OAPH:

readonly ObservableAsPropertyHelper<bool> isCmdRunning;

还有一个属性:

public bool IsCmdRunning => isCmdRunning.Value;

然后,在构造函数中:

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);

但是不知道有没有更好的办法。

最佳答案

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

搜索命令:

Search = ReactiveCommand.CreateFromObservable(
    () => Observable
        .StartAsync(ct => SearchImpl(ct))
        .TakeUntil(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);

关于c# - 执行一个命令直到另一个命令完成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50546817/

相关文章:

c# - 以 ^Bo 开头的字符串

c# - 了解非 bool 参数之间的按位比较

c# - 如何捕获子控件下的 mousemove 事件

c# - 当返回类型不重要时,是否有更优雅的方法来合并可观察对象?

reactiveui - ReactiveCommand.Execute 不触发 IsExecuting

c# - 如何提供 "object"并将其传递给 viewmodelbase?

c# - 如何在 C# 中逐个加载目录的文件?

wpf - 使用响应式(Reactive)命令

c# - 如何将 Combobox 绑定(bind)到 ReactiveUI 中的命令?

c# - 使用 ReactiveUI 禁用和启用文本字段更改上的按钮