【发布时间】:2012-10-05 16:05:58
【问题描述】:
我是 Rx 的新手,正在查看一些示例并遇到以下情况:
Observable.FromEventPattern<RoutedEventHandler, RoutedEventArgs>(
h => new RoutedEventHandler(h),
h => Loaded += h,
h => Loaded -= h)
.Select(_ => true)
.StartWith(IsLoaded)
.Where(l => l)
.Take(1)
.Subscribe(_ => Console.WriteLine("loaded");
我试图解构这个陈述以弄清楚它在做什么,但我并不是 100% 清楚。
我了解 FromEventPattern 如何将 Loaded 事件转变为可观察的序列。现在,Select 将在 IsLoaded 为真时触发(这是我的假设)。 Select 是否只是从 RoutedEventArgs 获取信息?
现在,我不确定为什么会有 StartsWith。 StartsWith 会将一系列值添加到可观察序列中。那么它只是将 IsLoaded 的值添加到列表的开头吗?在 Select 发生后它不是已经存在了吗?
.Where 没有应用任何类型的过滤器,因此 .Take 将只采用序列的第一个值(在这种情况下不再使用)。然后它订阅,只有在加载控件时才会写入控制台。
这个分析大部分正确吗?
另外,关于调试此类事情的任何提示(意思是,在链的不同阶段,序列是什么样的)?我可以通过附加调试器来获取信息,但我想知道是否还有其他可能常用的技巧/提示。
【问题讨论】:
-
我也是 Rx 的新手。根据使用情况,我怀疑
Where不是必需的。 -
对于过程中的任何步骤,您都可以手动注入 Do 方法并将结果输出到控制台(在 c++ 中这称为 printf 调试)。您可能还想试用visualrx.codeplex.com 工具以直观地查看运行时发生的情况。
-
@neontapri,如果在订阅时 IsLoaded 属性的值为 false,则 where 将删除 false 值,就像在 StartWith 运算符中一样。
标签: c# system.reactive