2016-01-21 75 views
1

我認爲,只要對它們進行預訂,就會評估冷的IObservables,就像從Observable.Create返回的那樣。我訂了一個訂閱。 IObservable沒有評估。如何開始評估寒冷的IObservable

class Program 
{ 
    static IObservable<int> HotSource() 
    { 
     return Observable.Generate<int, int>(0, x => x <= 100, x => x + 1, x => x); 
    } 
    static IObservable<int> ColdSource() 
    { 
     return Observable.Create<int>(subscriber =>() => 
     { 
      for (int i = 0; i <= 100; ++i) 
      { 
       subscriber.OnNext(i); 
      } 
     }); 
    } 
    static void Process(IObservable<int> numbers) 
    { 
     numbers 
      .Take(15) 
      .Subscribe(Console.WriteLine); 
    } 

    static void Main(string[] args) 
    { 
     Console.WriteLine("Hot"); 
     Process(HotSource()); 
     Console.WriteLine("Cold"); 
     Process(ColdSource()); 
     Console.WriteLine("End"); 
     Console.ReadLine(); 
    } 
} 
+1

什麼*確切*你的意思是「沒有評估」?你看見什麼了?如果您刪除「Take」呼叫,是否有任何變化? (謝謝你的完整樣本 - 當我可以運行它時)。 –

+0

我從'HotSource'看到打印的數字(當我移除對'HotSource'的調用時,它消失了)。當我在'ColdSource'內部放置一個斷點時,它不會觸發。 'Take'只是減少了'HotSource'的數量,這並不是真的需要。 – user2136963

+2

您的'HotSource()'實際上會返回一個冷的'IObservable',因爲這些值只會在訂閱時生成。 – Lukazoid

回答

3

您的創建方法已關閉。這將工作:

static IObservable<int> ColdSource() 
    { 
     return Observable.Create<int>(subscriber => 
     { 
      for (int i = 0; i <= 100; ++i) 
      { 
       subscriber.OnNext(i); 
      } 
      subscriber.OnCompleted(); 
      return Disposable.Empty; 
     }); 
    } 

你把它寫在的樣子,你正在返回一個Action恰好在取消訂閱。您希望代碼在訂閱時發生。

順便說一下,你的'熱'可觀察不是很熱。我不知道這對你是否有所幫助。你可以看到,在該代碼:

static void Main(string[] args) 
    { 
     Console.WriteLine("Hot 1"); 
     var hotSource = HotSource(); 
     Process(hotSource); 
     Thread.Sleep(TimeSpan.FromSeconds(2)); 
     Console.WriteLine("Hot 2"); 
     Process(hotSource); 
     Console.ReadLine(); 
    } 

如果hotSource是真正的熱點,每個號碼只能打印一次,否則他們將同時打印(1,1,2,2,等等)。

+0

如果你從create返回一個'IDisposable',一定要使用'subscriber.OnCompleted()',另一個選擇是不返回一個'IDisposable',並且'Create'的重載將自動調用'OnCompleted()' 。 – Lukazoid

+0

已添加完成。謝謝。 – Shlomo

+1

現已添加onCompleted。 :)變化沒有堅持第一次。 – Shlomo