4

次のサンプルは正常に機能します。

static IEnumerable<int> GenerateNum(int sequenceLength)
    {
      for(int i = 0; i < sequenceLength; i++)
      {
          yield return i;
      }
    }

static void Main(string[] args)
    {

        //var observ = Observable.Start(() => GenerateNum(1000));
        var observ = GenerateNum(1000).ToObservable();

        observ.Subscribe(
            (x) => Console.WriteLine("test:" + x),
            (Exception ex) => Console.WriteLine("Error received from source: {0}.", ex.Message),
            () => Console.WriteLine("End of sequence.")
            );

        Console.ReadKey();
    }

ただし、私が本当に望んでいるのは、コメント化された行を使用することです。つまり、「数値ジェネレーター」を非同期で実行し、新しい値が生成されるたびに、コンソールに出力する必要があります。動作しないようです-このコードを動作するように変更するにはどうすればよいですか?

4

1 に答える 1

7

コンソールアプリで非同期実行のためにこれを行う場合、ToObservable(IEnumerable<TSource>, IScheduler)オーバーロードを使用することをお勧めします(Observable.ToObservableメソッド(IEnumerable、IScheduler)を参照)。たとえば、組み込みのスレッドプールスケジュールを使用するには、

var observ = GenerateNum(1000).ToObservable(Scheduler.ThreadPool);

それは私のために働きます...拡張するために、次の完全な例は私があなたが意図していると思うように正確に働きます:

    static Random r = new Random();

    static void Main(string[] args) {

        var observ = GenerateNum(1000).ToObservable(Scheduler.ThreadPool );

        observ.Subscribe(
            (x) => Console.WriteLine("test:" + x),
            (Exception ex) => Console.WriteLine("Error received from source: {0}.", ex.Message),
            () => Console.WriteLine("End of sequence.")
            );

        while (Console.ReadKey(true).Key != ConsoleKey.Escape) {
            Console.WriteLine("You pressed a key.");
        }
    } 

    static IEnumerable<int> GenerateNum(int sequenceLength) {
        for (int i = 0; i < sequenceLength; i++) {
            Thread.Sleep(r.Next(1, 200));
            yield return i;
        }
    }
于 2012-02-03T17:27:36.050 に答える