gpt4 book ai didi

c# - 从事件中可观察到

转载 作者:行者123 更新时间:2023-12-01 23:33:32 25 4
gpt4 key购买 nike

我是 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 事件转换为可观察的序列。现在,当 IsLoaded 为 true 时(这就是我的假设),Select 将被触发。 Select 是否只是从 RoutedEventArgs 获取其信息?

现在,我不确定为什么 StartsWith 在那里。 StartsWith 将在可观察序列前面添加一系列值。那么它只是将 IsLoaded 的值添加到列表的开头吗? Select发生后它不是已经存在了吗?

.Where 没有应用任何类型的过滤器,因此 .Take 将仅采用序列的第一个值(在本例中不再使用)。然后它订阅并且仅在加载控件时才写入控制台。

这个分析大部分是正确的吗?

另外,关于调试此类事情的任何提示(也就是说,在链的不同阶段中的序列是什么样的)?我只需附加调试器即可获取信息,但我想知道是否还有其他可能常用的技巧/技巧。

最佳答案

大多数 Observable 运算符的工作方式与同名的 Enumerable 运算符相同。如果您有使用这些的经验,那么这里将会很有用。

因此,为了解决这个问题,我们暂时使用一个整数数组而不是可观察值。

int[] data = {1, 2, 3, 4};

这会将表达式更改为

var results = data.Select(_ => true) 
.StartWith(IsLoaded)
.Where(l => l)
.Take(1);
foreach (var r in results)
{
Console.WriteLine("loaded");
}

如果您在表达式的每个阶段创建一个数组,您将得到:

Select - {true, true, true, true}
StartWith - {value of IsLoaded, true, true, true, true}
Where - (if IsLoaded is true) {true, true, true, true, true}
(if IsLoaded is false) {true, true, true, true}
Take - {true}

使用 IEnumerables,做这类事情没有多大意义,因为您总是会得到一个 true 值(除非源数组为空且 IsLoaded 为 false)。

将其与 IObservable 一起使用是为了在加载对象时生成一个信号。

  • 如果对象在订阅时已加载,则 StartWith 会提供信号。
  • 但是,如果对象未加载,IsLoaded 将为 false,Where 会将其过滤掉,并且当事件触发时,它将触发通知。
    • Select 将忽略事件生成的实际数据,仅传递 true,这将继续通过 Where 过滤器。
  • Take 用于仅触发一次通知,无论它来自 StartWith,因为对象已经加载,或者事件(通过 选择),加载完成后。

关于c# - 从事件中可观察到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12750027/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com