C#可观察到的延迟,直到满足特定条件
本文关键字:满足 特定条件 观察 延迟 | 更新日期: 2023-09-27 17:59:23
我目前正在实现一个自动完成功能,当用户输入文本时,它会触发web服务上的搜索。
textChange.Subscribe(this.TextChanged);
此外,我在类中有一个属性,指示搜索是否正在运行IsRunning
。
现在,我想在IsRunning==true
时缓冲用户输入,并仅在IsRunning==false
带有新输入的文本时激发TextChange
方法。
你能帮我吗?
编辑:在不使用反应的情况下获得想法的示例代码:
public class AutoComplete
{
private bool isRunning;
private string textBuffer;
public AutoComplete()
{
this.textChanged += this.TextChanged;
}
public void TextChanged(string text)
{
if (isRunning) textBuffer = text;
else Search(text);
}
public void Search(string text)
{
isRunning = true;
// DoSearch()
isRunning = false;
// TODO: Search finished, check if textBuffer was filled and reexecute search with the new termn
}
}
由于您自己还没有尝试过Rx,我只想给出一些建议:
- 失去
isRunning
布尔,您希望在使用Rx时尽可能少地保持状态 - 使用
Select()
将输入的搜索字符串转换为执行搜索的Task,使Task返回结果 - 使用
Switch()
可放弃除最后一个搜索任务外仍在进行中的所有搜索任务。另请参阅:http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html#Switch - 您需要使用
Observable.FromAsync()
将搜索任务转换为可观察的任务 - 或者,使用
Throttle()
来限制请求数量(这样服务器就不会被请求过载)
编辑:由于您不希望同时运行多个搜索,因此需要在搜索运行时阻止流。你需要做一些类似的事情:
searchTermStream
.Select(l => Observable.FromAsync(asyncSearchMethod))
.Concat()
.Subscribe();
Concat()
运算符确保只有在前一个任务返回结果后才启动任务。
不过,我预测用户会觉得这很滞后,因为搜索所需的时间将超过用户输入新字符的时间。