我正在尝试理解以下代码,以尝试使用响应式(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,输出看起来
最佳答案
您似乎在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/