c# - 可从时间戳列表中观察到

标签 c# .net system.reactive

如果我有一个包含时间戳的对象列表 - 我怎样才能使可观察对象在时间戳之间的相对时间触发事件?

例如。如果我有三个时间戳为 2014-01-01 10:30、2014-01-01 10:45 和 2014-01-01 11:30 的对象,我希望第一个事件立即触发,然后在接下来的 15 分钟后触发, 以及 45 分钟后的最后一个。

我怎样才能加快这个过程,让 1 分钟等于 1 秒?因此,第一个事件会像以前一样立即触发,但下一个事件会在 15 秒后触发,而不是 15 分钟,依此类推。

最佳答案

我敢肯定有很多方法可以做到这一点,但这里有一个使用 Observable.Generate 在特定时间安排事件的快速示例。它使用事件列表 - 但鉴于它与迭代器一起使用,您可以轻松地调整它以使用其他来源:

void Main()
{
    var now = DateTime.Now;

    var events = new List<Tuple<DateTime, string>> {
        Tuple.Create(now.AddSeconds(5), "A"),
        Tuple.Create(now.AddSeconds(10), "B"),
        Tuple.Create(now.AddSeconds(15), "C")
    };

    var eventSource = Observable.Generate(
        (IEnumerator<Tuple<DateTime,string>>)events.GetEnumerator(),
        s => s.MoveNext(),
        s => s,
        s => s.Current.Item2, // the data
        s => s.Current.Item1); // the timing

    eventSource.Subscribe(Console.WriteLine);                       
}

这会在启动后写出“A”、“B”和“C”以及 5、10 和 15 秒。

为了加快时间,您可以围绕如何解释预定时间添加一些逻辑。另一种方法是使用 HistoricalScheduler。参见 this answer对此有一些见解。

关于c# - 可从时间戳列表中观察到,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22255205/

相关文章:

c# - Outlook 加载项属性错误

.net - 用于月亮和太阳落下/升起时间的 Web 服务或 .net 库?

.net - Rx : Are observables "repeatable" like IEnumerable,,如果没有,这段代码是如何工作的?

c# - xxHash 转换导致散列太长

c# - 如何(xml)序列化一个uri

c# - RemoveAll() 的目的

.net - MSDeploy 所有配置 [.config 文件] 在一个包中

c# - 来自 *Async 方法的 IObservable 序列

c# - 为此提供 RX 简单示例帮助

c# - 认证测试和 PDF