c# - 使用 RX 在不同时间触发事件?

标签 c# multithreading system.reactive

我有大量的简单对类:

public class Pair { public DateTime Timestamp; public double Value; }

它们按升序时间戳排序。我想在适当的时间为列表中的每个项目触发一个具有值(例如,Action)的事件。时间是过去的,所以我需要规范化时间戳,使列表中的第一个是“现在”。我们能否使用 Reactive Extensions 对其进行设置,使其在两个项目之间的时间差之后触发下一个事件?

最佳答案

pairs是你的序列:

var obs = pairs.OrderBy(p => p.Timestamp).ToObservable();

现在obs是作为有序可观察对象的对。

Observable.Zip(
    obs,
    obs.Take(1).Concat(obs),
    (pair1, pair2) => Observable.Timer(pair1.Timestamp - pair2.Timestamp)
      .Select(_ => pair1.Value))
.Concat()
.Subscribe(/* Do something here */);

zip 负责将绝对时间转换为偏移量。它将获取序列并将其与自身连接,但偏移一个,如下所示

Original 1--2--4--7--11
Offset   1--1--2--4--7--11
Joined   0--1--2--3--4

然后将这个新值放入 Observable.Timer 中延迟它适当的量。决赛ConcatIObservable<IObservable<double>> 的结果展平进入 IObservable<double> .这假定您的序列是有序的。

关于c# - 使用 RX 在不同时间触发事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10440451/

相关文章:

.net - Rx .NET : Filter observable until task is done

c# - TraceSource.TraceTransfer 与 TraceSource.TraceEvent(TraceEventType.Transfer

c# - 信号量停止我的线程

c# - DateTime.TryParseExact 格式 MM/dd/yyyy

c++ - Win API,每 X 秒更新一次静态控件

multithreading - 在 Kotlin Native 中,如何将对象保存在单独的线程中,并在不使用 C 指针的情况下从任何其他线程中改变其状态?

c# - 检测重复记录,只选择第一个并用 LINQ/C# 计数

java HashMap 线程可见性

c# - 使用 IObservable<T> 跟踪当前状态

c# - 如何使用 ReactiveUI 在 ViewModel 停用时正确取消任务?