gpt4 book ai didi

c# - 不超过每 100 毫秒从 observable 获取一次,但始终获取最终值

转载 作者:太空宇宙 更新时间:2023-11-03 21:59:26 25 4
gpt4 key购买 nike

我有一个 worker 公开了一个 Subject<string> ,它可以非常快速地发布日志消息。写入控制台很慢,所以我最多每 100 毫秒只写入一次控制台。任务完成后,我想写出最近发布的字符串,以避免出现类似 Doing work 2312/2400 ...done 的情况。 . (甚至 ...done 如果任务耗时 <100 毫秒。)

我是响应式(Reactive)扩展的新手,虽然我听说过它们有多棒,但这是我第一次注意到它们可以帮助我的情况。

所以,总而言之,1) 不要每 100 毫秒给我一个事件超过一次2) 我需要知道最后的事件,不管它什么时候到达。

我会将我的代码放在下面的答案中,但请提出更好的建议。也许我错过了实现此目的的标准调用?

最佳答案

它实际上比你弄清楚 if 可观察对象更简单,它是你名为 OnCompleted() 的事件的来源当它完成时。这将自行解决问题:

observable.Sample(TimeSpan.FromMilliseconds(100)).Subscribe(log);

这是因为Sample当它的事件源完成时,将最后一次触发。这是一个完整的测试:

var sub = new Subject<string>();
var gen = Observable.Interval(TimeSpan.FromMilliseconds(50)).Select((_,i) => i).Subscribe(i => sub.OnNext(i.ToString()));

sub.Sample(TimeSpan.FromSeconds(1))
.Subscribe(Console.WriteLine);

Thread.Sleep(3500);
sub.OnCompleted();

即使我睡了 3.5 秒,也会触发 4 个事件,最后一个在我调用 OnCompleted() 时触发.

另一点要注意的是如果 Worker.GetObservable() 是错误的形式实际上返回一个 Subject<string> - 即使是在 Worker 类中,它真正应该做的只是返回 IObservable<string>界面。这不仅仅是样式,它是关注点分离并返回所需的最小功能接口(interface)。

关于c# - 不超过每 100 毫秒从 observable 获取一次,但始终获取最终值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10848128/

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