我的要求是在x秒间隔之后循环来自IEnumerable
集合的消息。
实际上我有一个IEnumerable<Message>
可以说5条消息,当屏幕(WPF)加载时,我正在显示收集的第一条消息,下一条消息将显示在x秒之后,依此类推。
我想到的一个解决方案是使用调度程序计时器。还有其他方法可以做同样的事吗?
答案 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相同,但这里的语法更清晰,可以在每个计时器刻度上枚举一次。