2014-11-15 62 views
1

以下代碼將結果延遲2秒。我想要的是立即返回結果,但每2秒發射一個新的觀察值。我錯過了什麼?Observable.Generate延遲結果

輸出:

**The current output is:** 
05: 1. Run 
07 Result: 1 

07: 2. Run 
09 Result: 2 

09: 3. Run 
11 Result: 3 


**Desired output is:** 
05: 1. Run 
05 Result: 1 

07: 2. Run 
07 Result: 2 

09: 3. Run 
09 Result: 3 

CODE:

var sources = Enumerable.Range(1, 8).Select(i => 
               { 
                Console.WriteLine("{0}: {1}. Run", DateTimeOffset.Now.ToString("ss"), i); 

                return Observable.Return(i, CurrentThreadScheduler.Instance); 
               }); 

    Observable.Generate(sources.GetEnumerator(), e => e.MoveNext(), e => e, e => e.Current, e => TimeSpan.FromMilliseconds(2000), ThreadPoolScheduler.Instance) 
       .Merge() 
       .Timestamp() 
       .Do(r => 
        { 
         Console.WriteLine("{0} Result: {1}{2}", r.Timestamp.ToString("ss"), r.Value, Environment.NewLine); 
        }, 
        ex => 
        { 
         Console.WriteLine(ex.ToString()); 
        }, 
       () => 
        { 
         Console.WriteLine("Completed"); 
        }) 
       .Subscribe(); 
+0

這真的不是完全清楚你在這裏以後有什麼 - 我相信保羅的回答您的評論表示您希望可變數據驅動的區間,但除此之外,還有(給我訓練有素的Rx眼睛)代碼中有很多「奇怪的東西」。也許用非rx的術語解釋你試圖達到的目標是有用的。例如,它並不完全清楚爲什麼你要爲'sources'創建'IEnumerable ',因爲它看起來像'IEnumerable <>'會做的。目前還不清楚'sources'是否應該包含指示期望間隔的數據。 –

回答

0

如何:

Observable.Interval(TimeSpan.Zero, TimeSpan.FromSeconds(2.0)) 
    .SelectMany(_ => GenerateAnObservable()) 
    .Subscribe(/* ... */); 
+0

我在每個循環中爲可變週期選擇器使用generate。 –

0

如何替換當前Observable.Generate本:

Observable 
    .Generate(
     0, 
     i => true, 
     i => i + 1, 
     i => i, 
     i => TimeSpan.FromMilliseconds(i == 0 ? 0 : 2000), 
     ThreadPoolScheduler.Instance) 
    .Zip(sources, (g, s) => s) 

我得到了這樣的結果:

41: 1. Run 
41 Result: 1 

43: 2. Run 
43 Result: 2 

45: 3. Run 
45 Result: 3 

47: 4. Run 
47 Result: 4 

49: 5. Run 
49 Result: 5 

51: 6. Run 
51 Result: 6 

53: 7. Run 
53 Result: 7 

55: 8. Run 
55 Result: 8 

Completed