gpt4 book ai didi

c# - .PublishLast()(以前称为 Prune)的用例

转载 作者:行者123 更新时间:2023-11-30 14:40:44 24 4
gpt4 key购买 nike

在我看来,我对 RX 函数有很好的“感觉”——我使用了其中的许多函数,或者可以想象其他函数如何有用——但我找不到 .Prune 函数的位置。我知道这是对 AsyncSubject 的多播,但这在实际场景中有何用处?

编辑:Richard 说 WebRequest 是 Prune() 的一个很好的候选者。我仍然不知道如何。让我们举个例子——我想将传入的 uri 转换为图像:

    public static IObservable<BitmapImage> ToImage(this IObservable<string> source)
{
var streams =
from wc in source.Select(WebRequest.Create)
from s in Observable
.FromAsyncPattern<WebResponse>(wc.BeginGetResponse,
wc.EndGetResponse)()
.Catch(Observable.Empty<WebResponse>())
select s.GetResponseStream();
return streams
.ObserveOnDispatcher()
.Select(x =>
{
var bmp = new BitmapImage();
bmp.SetSource(x);
return bmp;
});
}

我认为没有必要将 .Prune 附加到 .FromAsyncPattern,因为当您调用 FromAsyncPattern()(很热)时,您会“立即”订阅。

最佳答案

因为它was confirmed on the RX Forum Prune 只是一个便利操作符。

如果您的 observable 具有单个值并且您正在发布它,则可以将 Publish\Connect 替换为对 .Prune() 的单个调用

所以根据我的经验,Prune 最常见的场景是:

  • 你有一个冷的可观察对象,它会产生副作用并且只发出一个值
  • 您有多个订阅者订阅了该 observable,因此您想使其成为热点(因为有副作用)

论坛中指出的另一种情况是,当您需要在热可观察对象上缓存特定值时(通常是第一个)。然后你使用 FromEvent(...).Take(1).Prune() 并且订阅它的任何人都将获得相同的保证值。这不仅仅是“方便”,而且几乎是实现结果的唯一简单方法。

毕竟非常有用!

关于c# - .PublishLast()(以前称为 Prune)的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4976593/

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