私の要件は、x秒の間隔の後にIEnumerable
コレクションからのメッセージを循環させることです。 実際に私はIEnumerable<Message>
には5つのメッセージがあり、スクリーン(WPF)がロードされるとコレクションの最初のメッセージが表示され、次のメッセージがx秒後に表示されます。IEnumerableからメッセージを読み込むための洗練された方法をお探しですか?
ディスパッチャータイマーを使用することが1つの解決策になります。同じことをする他の方法は?
私の要件は、x秒の間隔の後にIEnumerable
コレクションからのメッセージを循環させることです。 実際に私はIEnumerable<Message>
には5つのメッセージがあり、スクリーン(WPF)がロードされるとコレクションの最初のメッセージが表示され、次のメッセージがx秒後に表示されます。IEnumerableからメッセージを読み込むための洗練された方法をお探しですか?
ディスパッチャータイマーを使用することが1つの解決策になります。同じことをする他の方法は?
AFAIKタイマは、この目的のために正確に設計されており、その性能が優れています。 他に何か必要なのはなぜですか?
リアクティブエクステンションを使用してこれを行うことができます。何かのように:
messages.ToObservable().Delay(new Timespan(0,0,x)).ObserveOn(Dispatcher)
.Subscribe(m => ShowMessage(m));
私はこれがうまくいくとは思わないが、正確にはx秒間遅れてしまい、一度にすべてのメッセージを吐き出す。 – McGarnagle
私はこのアイデアが好きです。私の答えは、これらの行に沿った実際の例を参照してください。 – McGarnagle
この答えははAnkurさんのラインに沿っている - タイマーベースに観察シーケンスを生成する反応性の拡張機能を使用します。もちろん
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と同じですしかし、ここのシンタックスは、各タイマーティックに1回列挙するためのより洗練されたものです。
あなたは言う: > ...と画面が読み込まれるとき... どの画面? ASP.NET Web画面、WinForms、WPF、Silverlight? UIは答えに差をつけます。 たとえば、WPFでは、Expression Blendを使用してストーリーボードを設定します。しかし、ASP.NETやWinFormsではこれを使用しません。 – Rhyous
あなたの目標は何ですか? WPF? Windowsフォーム?ウェブ? Silverlight? – Zruty
私はWPF画面について取り上げています。 –