C# 使用被动扩展如何创建一个动态列表,其中包含可能过期的值

C# 使用被动扩展如何创建一个动态列表,其中包含可能过期的值,c#,system.reactive,C#,System.reactive,场景 我每100毫秒接收一次不同的通知id(Source1),我需要将每个id放入缓存中,并带有特定的接收日期,如果id出现两次,我只更新日期。之后,我需要搜索调用服务的ID的信息,当我在我的应用程序上收到该信息时,我需要按收到的日期显示该信息,每5秒更新一次屏幕。如果Source1未在10秒内刷新任何id,则需要更改状态以在其他类别或状态中显示该id 问题 我尝试使用反应式扩展来解决这个问题,但我不确定这是否是正确的技术,因为: 我不知道缓存应该放在哪里,也不知道如何管理这些状态 一般来说,

场景

我每100毫秒接收一次不同的通知id(Source1),我需要将每个id放入缓存中,并带有特定的接收日期,如果id出现两次,我只更新日期。之后,我需要搜索调用服务的ID的信息,当我在我的应用程序上收到该信息时,我需要按收到的日期显示该信息,每5秒更新一次屏幕。如果Source1未在10秒内刷新任何id,则需要更改状态以在其他类别或状态中显示该id

问题

我尝试使用反应式扩展来解决这个问题,但我不确定这是否是正确的技术,因为:

  • 我不知道缓存应该放在哪里,也不知道如何管理这些状态
  • 一般来说,管理并发性的最佳方法是如何调用外部服务,同时我可以收到更多的ID,可以是新的,也可以是旧的
最后,作为信息的结果,我可以看到哪些元素正在更新,哪些元素没有更新


有人能帮我吗?谢谢

听起来,
.Scan
操作员可能会满足您的需要

试试这个:

var source = new Subject<int>();

var query =
    source
        .Scan(new Dictionary<int, DateTime>(), (a, x) =>
        {
            a[x] = DateTime.Now;
            return new Dictionary<int, DateTime>(a);
        })
        .Select(x => x.OrderByDescending(y => y.Value));
我得到:

不过最好使用
ImmutableDictionary
,因此查询如下所示:

var query =
    source
        .Scan(
            new Dictionary<int, DateTime>().ToImmutableDictionary(),
            (a, x) => a.SetItem(x, DateTime.Now))
        .Select(x => x.OrderByDescending(y => y.Value));
var查询=
来源
.扫描(
新建字典().ToImmutableDictionary(),
(a,x)=>a.SetItem(x,DateTime.Now))
.选择(x=>x.OrderByDescending(y=>y.Value));

var查询=
来源
.Scan(ImmutableDictionary.Empty,(a,x)=>a.SetItem(x,DateTime.Now))
.选择(x=>Observable.Interval(TimeSpan.FromSeconds(5.0)).选择(y=>x).StartWith(x))
.Switch()
.选择(x=>x.OrderByDescending(y=>y.Value));

尝试此查询-当源产生值时,它会继续产生值,但在最新值出现后每5秒,它会重复最后一项(除非源产生值,然后重置5秒计时器)。

这听起来像是Rx的完美工作。您确实应该显示一些代码——至少通知是什么样子的,以及维护通知以供显示所需的数据结构。理想情况下,你应该自己尝试一下,看看你能做些什么,然后再发布代码。更简单的构造函数:
ImmutableDictionary.Empty
谢谢你的回答,这非常有用,尽管我正在尝试每5秒获取一次所有的字典,当任何数据出现时,我不知道我的方法是否是实现这一点的最佳方法。我试着使用它:
var intervalTimer=Observable.Return(-1).Delay(TimeSpan.FromSeconds(5)).Repeat()然后像这样进行合并:
source.merge(intervalTimer).Scan(ImmutableDictionary.Empty,(a,x)=>a.SetItem(x,DateTime.Now))
@Ivan-你能解释一下“当任何数据到来时,每5秒所有字典”是什么意思吗?我不清楚你在说什么。对不起,让我解释清楚。每当我收到数据事件或5秒无数据发生时,我都需要收到通知。由于这个原因,我使用了合并和间隔计时器。问题是,有时我将数据事件和计时器生成的事件放在同一个位置moment@Enigmativity它工作得很好,非常感谢你。现在我可以继续我的项目了。
var query =
    source
        .Scan(
            new Dictionary<int, DateTime>().ToImmutableDictionary(),
            (a, x) => a.SetItem(x, DateTime.Now))
        .Select(x => x.OrderByDescending(y => y.Value));
var query =
    source
        .Scan(ImmutableDictionary<int, DateTime>.Empty, (a, x) => a.SetItem(x, DateTime.Now))
        .Select(x => Observable.Interval(TimeSpan.FromSeconds(5.0)).Select(y => x).StartWith(x))
        .Switch()
        .Select(x => x.OrderByDescending(y => y.Value));