2016-07-13 7 views
2
using System; 
using System.Reactive; 
using System.Reactive.Linq; 
using System.Reactive.Subjects; 
using System.Threading.Tasks; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     public static void Main() 
     { 
      Run().GetAwaiter().GetResult(); 
      Console.WriteLine("Press any key ..."); 
      Console.ReadKey(); 
     } 

     private static async Task Run() 
     { 
      await Task.Delay(1); 

      var dst = new Subject<int>(); 
      var res = dst 
       .SelectMany(async arg => 
       { 
        await Task.Delay(1); 
        Console.WriteLine(arg); 
        return Unit.Default; 
       }) 
       .DefaultIfEmpty(); 
      Observable.Range(0, 10).Subscribe(dst); 

      await res; 
     } 
    } 
} 

私は出力に10の数字を期待しますが、実際には何も得られません。どうして?以下の簡単なRx.NETで数字が表示されないのはなぜですか?

+0

これはほとんどRxの「些細な」使用ではありません。 – Enigmativity

+2

+1知りたいことやできることは何ですか? IMOのほとんどのRxソリューションはSubjectの使用を伴わないが、Rxの問題はたくさんある。 –

+0

私はこのコードがなぜ機能しないのか理解したい - それだけです。 – mark

答えて

3

Observable.Range(0, 10).Subscribe(dst);が現在のスレッドで完了して実行されているため、await resと呼ばれるときには新しい値がありません。

コードから値を取得するには、(1)var dst = new ReplaySubject<int>();または(2)Observable.Range(0, 10).Delay(TimeSpan.FromSeconds(1.0)).Subscribe(dst);のいずれかを実行できます。

いずれにせよ、これは簡単なRxではありません。


私はので、私はそれがここに追加する価値があったと思った李氏のコメントは特によく書かれていたと思った:

すなわちObservable.Range(0, 10).Subscribe(dst);すぐ対象に10個の値をポンプ。次に、resでサブスクリプションを呼び出します。値はなくなりました。 Subject<T>は値をキャッシュしません。これはイベントを10回発生させてから、イベントハンドラをアタッチするようなものです。

+1

、すなわち 'Observable.Range(0、10).Subscribe(dst);'は被験者に直ちに10値を送ります。次に、 'res'でサブスクリプションを呼び出します。値はなくなりました。 'Subject 'は値をキャッシュしません。それはイベントを10回起こしてから、イベントハンドラをつけるようなものです。 –

関連する問題