C#可观察到的延迟,直到满足某些条件

时间:2015-06-23 10:53:00

标签: c# system.reactive observablecollection

我目前正在实施自动填充功能,当用户输入文字时会触发对网络服务的搜索。

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

1 个答案:

答案 0 :(得分:3)

由于你自己没有尝试过Rx,我只想给出一些指示:

  1. 丢失isRunning bool,您希望在使用Rx时尽量保持尽可能少的状态。
  2. 使用Select()将输入搜索字符串转换为执行搜索的任务,让任务返回结果。
  3. 使用Switch()放弃除最后一个搜索任务之外仍在进行中的所有搜索任务。另见:http://www.introtorx.com/content/v1.0.10621.0/12_CombiningSequences.html#Switch
  4. 您需要使用Observable.FromAsync()将搜索任务转换为可观察对象。
  5. (可选)使用Throttle()来限制请求数量(这样您的服务器就不会因请求而超载)。
  6. 编辑:由于您不希望同时运行多个搜索,因此您需要在搜索运行时阻止该流。您需要执行以下操作:

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

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

    我预测这对用户来说会感到迟钝,因为搜索所需的时间比用户输入新角色所需的时间长。