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
        }
    }

C#可观察到的延迟,直到满足特定条件

由于您自己还没有尝试过Rx,我只想给出一些建议:

  1. 失去isRunning布尔,您希望在使用Rx时尽可能少地保持状态
  2. 使用Select()将输入的搜索字符串转换为执行搜索的Task,使Task返回结果
  3. 使用Switch()可放弃除最后一个搜索任务外仍在进行中的所有搜索任务。另请参阅:http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html#Switch
  4. 您需要使用Observable.FromAsync()将搜索任务转换为可观察的任务
  5. 或者,使用Throttle()来限制请求数量(这样服务器就不会被请求过载)

编辑:由于您不希望同时运行多个搜索,因此需要在搜索运行时阻止流。你需要做一些类似的事情:

searchTermStream    
.Select(l => Observable.FromAsync(asyncSearchMethod))
.Concat()
.Subscribe();

Concat()运算符确保只有在前一个任务返回结果后才启动任务。

不过,我预测用户会觉得这很滞后,因为搜索所需的时间将超过用户输入新字符的时间。