我有这样的东西:
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/