2011-08-10 10 views
1

私の要件は、x秒の間隔の後にIEnumerableコレクションからのメッセージを循環させることです。 実際に私はIEnumerable<Message>には5つのメッセージがあり、スクリーン(WPF)がロードされるとコレクションの最初のメッセージが表示され、次のメッセージがx秒後に表示されます。IEnumerableからメッセージを読み込むための洗練された方法をお探しですか?

ディスパッチャータイマーを使用することが1つの解決策になります。同じことをする他の方法は?

+0

あなたは言う: > ...と画面が読み込まれるとき... どの画面? ASP.NET Web画面、WinForms、WPF、Silverlight? UIは答えに差をつけます。 たとえば、WPFでは、Expression Blendを使用してストーリーボードを設定します。しかし、ASP.NETやWinFormsではこれを使用しません。 – Rhyous

+0

あなたの目標は何ですか? WPF? Windowsフォーム?ウェブ? Silverlight? – Zruty

+0

私はWPF画面について取り上げています。 –

答えて

2

AFAIKタイマは、この目的のために正確に設計されており、その性能が優れています。 他に何か必要なのはなぜですか?

1

リアクティブエクステンションを使用してこれを行うことができます。何かのように:

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

私はこれがうまくいくとは思わないが、正確にはx秒間遅れてしまい、一度にすべてのメッセージを吐き出す。 – McGarnagle

+0

私はこのアイデアが好きです。私の答えは、これらの行に沿った実際の例を参照してください。 – McGarnagle

0

この答えはは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回列挙するためのより洗練されたものです。

関連する問題