寻找一种优雅的方式来加载来自IEnumerable的消息

时间:2011-08-10 08:38:08

标签: c# generics dispatcher

我的要求是在x秒间隔之后循环来自IEnumerable集合的消息。 实际上我有一个IEnumerable<Message>可以说5条消息,当屏幕(WPF)加载时,我正在显示收集的第一条消息,下一条消息将显示在x秒之后,依此类推。

我想到的一个解决方案是使用调度程序计时器。还有其他方法可以做同样的事吗?

3 个答案:

答案 0 :(得分:2)

AFAIK计时器专为此目的而设计,并在其中表现良好。 为什么还要别的?

答案 1 :(得分:1)

您可以使用反应式扩展来执行此操作。类似的东西:

messages.ToObservable().Delay(new Timespan(0,0,x)).ObserveOn(Dispatcher)
.Subscribe(m => ShowMessage(m));

答案 2 :(得分:0)

这个答案与Ankur的一致 - 使用Reactive扩展来生成基于计时器的可观察序列:

public ObservableCollection<Message> Messages { get; set; }

void QueueMessages(IEnumerable<Message> messages)
{
    int intervalSeconds = 5;

    // generate the observable source
    var enumerator = messages.GetEnumerator();
    var source = Observable.Generate(
            enumerator,                                  // initial value
            i => enumerator.MoveNext(),                  // condition
            i => i,                                      // iterate
            i => enumerator.Current,                     // selector
            i => TimeSpan.FromSeconds(intervalSeconds))  // interval selector
        .ObserveOnDispatcher();

    // subscribe to the source
    source.Subscribe(

        // display messages as they arrive
        message => Messages.Add(message),

        // add a "complete" message when done
        () => Messages.Add(new Message("complete!"))
    );
}

当然,效果与DispatcherTimer相同,但这里的语法更清晰,可以在每个计时器刻度上枚举一次。