Наблюдение асинхронной последовательности с «доходностью возврата» - PullRequest
4 голосов
/ 03 февраля 2012

Следующий пример отлично работает:

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();
    }

Тем не менее, я действительно хочу использовать закомментированную строку - то есть я хочу запустить «генератор чисел» асинхронно, и каждый раз, когда он выдает новое значение, я хочу, чтобы он выводился на консоль. Кажется, он не работает - как я могу изменить этот код для работы?

1 Ответ

7 голосов
/ 03 февраля 2012

При выполнении этого для асинхронного выполнения в консольном приложении вы можете использовать перегрузку ToObservable(IEnumerable<TSource>, IScheduler) (см. Observable.ToObservable Method (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;
        }
    }
...