0

IntroToRxを読んでいて、サンプル コードに少し問題があります。これが私のコードの合計です:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace LearningReactiveExtensions
{
  public class Program
  {
    static void Main(string[] args)
    {
        var observable = Observable.Interval(TimeSpan.FromSeconds(5));
        observable.Subscribe(
          Console.WriteLine, 
          () => Console.WriteLine("Completed")
        );
        Console.WriteLine("Done");
        Console.ReadKey();
    }

  }
}

私がこの本を正しく理解していれば、これは一連の数字をコンソールに書き出すはずDispose()です。

ただし、コードを実行すると、最後に「完了」しか表示されません。数字も、「完了」も、「完了」だけです。

ここで何が間違っていますか?

4

2 に答える 2

2

5 秒が経過するのを待つ忍耐力がなかったと仮定しています。

覚えておくべき主な考え方は、ほとんどすぐに呼び出し元のメソッドに制御が戻るRxということです。つまり、結果が生成されるまでブロックしません。したがって、への呼び出しは5 秒後にのみ呼び出されます。Observable.SubscribeObservable.SubscribeConsole.WriteLine

于 2013-08-24T07:38:28.313 に答える
0

あなたがしていることをメインスレッドに待たせる何らかの方法が必要です。必要に応じてセマフォを使用できます

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reactive.Disposables;
using System.Reactive.Linq;
using System.Reactive.Subjects;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace LearningReactiveExtensions
{
  public class Program
  {
    static void Main(string[] args)
    {
         SemaphoreSlim ss = new SemaphoreSlim(1);
        var observable = Observable.Interval(TimeSpan.FromSeconds(5));
        observable.Subscribe(
          Console.WriteLine, 
          () => {
               Console.WriteLine("Completed");
               ss.Release();
          }
        );
        ss.Wait();
        Console.WriteLine("Done");
        Console.ReadKey();
    }

  }
}

この場合、おそらく書くだけの方が良いでしょうが

  static void Main(string[] args)
   {
        SemaphoreSlim ss = new SemaphoreSlim(1);
        Observable.Interval(TimeSpan.FromSeconds(5)).Wait();
        Console.WriteLine("Completed");
        Console.WriteLine("Done");
        Console.ReadKey();
   }
于 2013-08-24T08:51:08.163 に答える