2011-08-10 2 views
1

제 요구 사항은 x 초 간격 후에 IEnumerable 컬렉션의 메시지를 순환시키는 것입니다. 실제로 나는 5 개의 메시지를 가지고 있고 화면 (WPF)이로드 될 때 컬렉션의 첫 번째 메시지를 보여 주며 다음 메시지는 x 초 후에 말한 식으로 표시된다는 등 IEnumerable<Message>이 있습니다.IEnumerable에서 메시지를로드하는 우아한 방법 찾기

디스패처 타이머를 사용하는 것이 하나의 해결책입니다. 같은 일을하는 다른 방법은 없나요?

+0

당신은 말합니다 : ... 그리고 화면이로드 될 때 ... 어떤 화면이 표시됩니까? ASP.NET 웹 화면, WinForms, WPF, Silverlight? UI가 대답에 차이를 만듭니다. 예를 들어 WPF에서는 Expression Blend를 사용하여 스토리 보드를 설정할 수 있습니다. 하지만 ASP.NET이나 WinForms에서는 사용하지 않을 것입니다. – Rhyous

+0

당신의 목표는 무엇입니까? WPF? Windows Forms? 편물? 실버 라이트? – 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과 동일 ,하지만 여기의 구문은 각 타이머 틱에서 한 번 열거되기에 더 깨끗합니다.

관련 문제