gpt4 book ai didi

c# - 如何在完成之前从 ReplaySubject 获取最新值

转载 作者:行者123 更新时间:2023-11-30 12:15:45 27 4
gpt4 key购买 nike

我需要一种方法来获取最近添加到符合特定条件的 ReplaySubject 的项目。下面的示例代码完成了我需要它做的事情,但感觉不是正确的方法:

static void Main(string[] args)
{
var o = new ReplaySubject<string>();

o.OnNext("blueberry");
o.OnNext("chimpanzee");
o.OnNext("abacus");
o.OnNext("banana");
o.OnNext("apple");
o.OnNext("cheese");

var latest = o.Where(i => i.StartsWith("b"))
.Latest().First();

Console.WriteLine(latest);

Console.WriteLine("Press any key to exit");
Console.ReadKey();
}

输出:

banana
Press any key to exit

最初,我尝试使用 .Where().TakeLast(1);但是,我现在从以前的 question 中知道您必须在 TakeLast() 返回任何内容之前对该主题调用 OnComplete()。调用 OnComplete() 对我来说不是一个选项,因为我需要保持此流打开。

任何人都可以验证这是否是我想要完成的最有效的方法吗?谢谢!

编辑

请注意,我使用的是 Reactive Extensions,IEnumerable 代码示例将不起作用。

更新

我倾向于以下代码,因为我相信它是非阻塞的,除非有人能告诉我不同​​的说法:

var latest = o.Where(i => i.StartsWith("b")).Replay(1);

using (latest.Connect())
latest.Subscribe(Console.WriteLine);

最佳答案

您可以考虑使用 BehaviorSubject<string> .缺点是您必须在开始时订阅,但这可能正是您想要做的。这应该为您提供所需的隔离。

var o = new ReplaySubject<string>();
var bs = new BehaviorSubject<string>(default(string));
o.Where(i => i.StartsWith("b")).Subscribe(bs);

o.OnNext("blueberry"); Console.WriteLine(bs.First());
o.OnNext("chimpanzee"); Console.WriteLine(bs.First());
o.OnNext("abacus"); Console.WriteLine(bs.First());
o.OnNext("banana"); Console.WriteLine(bs.First());
o.OnNext("apple"); Console.WriteLine(bs.First());
o.OnNext("cheese"); Console.WriteLine(bs.First());

输出:

blueberry
blueberry
blueberry
banana
banana
banana

关于c# - 如何在完成之前从 ReplaySubject<T> 获取最新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6762163/

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