2017-04-13 3 views
0

Ich versuche, ein Zeitintervall zu dieser Observable-Sequenz hinzufügen (Das ist eine Ganzzahl-Sequenz in einer bestimmten Zeitspanne), aber es scheint nicht zu funktionieren. Wenn ich die Zeit entferne, dann funktioniert es Zeit. Wende ich den Timer falsch an?Observable mit Zeitintervall nicht Ergebnisse bei subscribe

var timer = Observable.Interval(TimeSpan.FromSeconds(2)).Take(4); 
var nums = Observable.Range(1,1200).Where(a => a % 2 == 0); 
var sourcenumbs = timer.SelectMany(nums); 


var results = sourcenumbs.Subscribe(
       x => Console.WriteLine("OnNext: {0}",x), 
       ex => Console.WriteLine("OnError: {0}",ex.Message), 
      () => Console.WriteLine("OnComplete") 
); 

Dieser Code zeigt keine Ausgabe an, wird es Dispose erhalten, bevor es das Subscribe erreicht?

Aber wenn ich einen Forloop mit einem Timer darin hatte, dann funktioniert es. Warum?

for (int i = 0; i < 10; i++) 
{ 
    Thread.Sleep(TimeSpan.FromSeconds(0.9)); 
} 
+0

Was meinen Sie mit "Hinzufügen eines Zeitintervalls zu dieser beobachtbaren Sequenz". Was ist die Ausgabe, die Sie erwarten? Wie steht die for-Schleife überhaupt zur beobachtbaren Sequenz? – Euphoric

+0

@Euphoric Ich möchte die geraden Zahlen von 1, 1200 alle 2 Sekunden, ohne die "Observable.Interval" es funktionierte gut, aber ich wollte einen Timer hinzufügen. –

Antwort

0

Ist das, was Sie wollen?

static void Main(string[] args) 
{ 
    Execute(); 

    Console.ReadKey(); 
} 

private static async void Execute() 
{ 
    var intervals = Observable.Interval(TimeSpan.FromSeconds(2)).StartWith(0); 
    var evenNumbers = Enumerable.Range(1, 1200).Where(a => a % 2 == 0); 

    var evenNumbersAtIntervals = intervals.Zip(evenNumbers, (_, num) => num); 

    try 
    { 
     await evenNumbersAtIntervals.ForEachAsync(
      x => Console.WriteLine("OnNext: {0}", x) 
     ); 

     Console.WriteLine("Complete"); 
    } 
    catch(Exception e) 
    { 
     Console.WriteLine("Exception " + e); 
    } 
} 

Beachten Sie, dass die Zahlen sind Enumerable und nicht Observable.

+0

Ich habe das versucht, aber es zeigt immer noch nichts in der Konsole an. –

+0

@SeekAddo Sie müssen die Konsole vom Schließen abhalten, da der Code asynchron ausgeführt wird. Der einfachste Weg ist Console.ReadKey(). Siehe meine Bearbeitung. – Euphoric

+0

Sie wurden geschrieben. Ich verwende Rider, damit die Konsole nicht wie in Visual Sutdio geschlossen wird, sondern mit der Console.ReadKey() geholfen hat. –

Verwandte Themen