我正在尝试理解以下代码,以尝试使用响应式(Reactive)扩展

 IObservable<string> textChangedObservable =
            Observable.FromEventPattern<TextChangedEventArgs>(searchScrip, "TextChanged")
                .Select(evt => ((TextBox) sender).Text);

 textChangedObservable.Subscribe(OnNext, OnCompleted);

private void OnNext(string s)
    {
        System.Diagnostics.Debug.Print("OnNext " + s + "\n");
    }

    private void OnCompleted()
    {
        System.Diagnostics.Debug.Print("OnCompleted " + "\n");
    }

如果我在输入框中输入SEARC,输出看起来
  • OnNext SE
  • OnNext SEA
  • OnNext SEA
  • OnNext SEAR
  • OnNext SEAR
  • OnNext SEAR
  • OnNext SEARC
  • OnNext SEARC
  • OnNext SEARC
  • OnNext SEARC
  • 为什么“S”不触发OnNext?
  • 为什么从不调用OnCompleted?
  • 为什么OnNext在第n个字符上称为n-1次?
  • 最佳答案

    您似乎在searchScrip_TextChanged处理程序中订阅了observable。

    这意味着searchScrip_TextChanged第一次被称为S已经在发生之前就已经在发生了,您已经连接了可观察对象。因此,它当然不会触发。

    但是,现在S命中了,您有一个订阅,因此当键入E时,您将获得一个SE。但是,由于searchScrip_TextChanged处理函数也被称为E,因此您现在对可观察对象也有两个订阅。

    因此,当键入A时,您会得到两个SEA,因为您有两个可观察对象。但是,再次为searchScrip_TextChanged调用了A,因此现在您有了三个可观察的对象。

    等等等等

    事件不会自动完成。您需要手动处理订阅以使订阅结束。这应该是有道理的,因为这就是您要停止的常规事件处理程序所要做的。

    加载表单时,应创建可观察对象,以便创建一次。

    它看起来应该像这样:

    IObservable<string> textChangedObservable =
            Observable.FromEventPattern<TextChangedEventArgs>(searchScrip, "TextChanged")
                .Select(evt => searchScrip.Text);
    
    IDisposable subscription =
        textChangedObservable
            .Subscribe(
                s => Debug.Print("OnNext " + s + "\n"),
                s => Debug.Print("OnCompleted\n"));
    

    关于c# - react 性扩展的可观察模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32398622/

    10-13 08:31