我目前正在实施自动填充功能,当用户输入文字时会触发对网络服务的搜索。
textChange.Subscribe(this.TextChanged);
此外,我的班级中有一个属性,表明搜索是否正在运行IsRunning
。
现在,我希望在IsRunning==true
时缓冲用户输入,并仅在TextChange
方法中使用新输入的文字时触发IsRunning==false
方法。
编辑:示例代码以获得想法而不使用被动:
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
}
}
答案 0 :(得分:3)
由于你自己没有尝试过Rx,我只想给出一些指示:
isRunning
bool,您希望在使用Rx时尽量保持尽可能少的状态。Select()
将输入搜索字符串转换为执行搜索的任务,让任务返回结果。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()
运算符确保只在前一个任务返回结果后才启动任务。
我预测这对用户来说会感到迟钝,因为搜索所需的时间比用户输入新角色所需的时间长。