справиться с холодными наблюдаемыми - PullRequest
0 голосов
/ 27 сентября 2011

in Rx , следующий код, кажется, не вызывает мое действие OnCompleted?

Нет «Последовательность завершена»

    static void Main(string[] args)
    {
        var list = new List<int> { 1, 2, 3 };
        var obs = list.ToObservable();
        IDisposable subscription = obs.SubscribeOn(Scheduler.NewThread).Subscribe(p =>
        {
            Console.WriteLine(p.ToString());
            Thread.Sleep(200);
        },
        p => Console.WriteLine("Sequence completed"));
        Console.ReadLine();
        subscription.Dispose();
    }

Я что-то делаю глупо, так как в окне консоли не напечатано "Sequence Completed" после 3?

Консольный вывод

1
2
3
_

Итак, основной вопрос моего вопроса как запустить некоторый код после итерации этого типа последовательности ?

  • например. как выполнить Console.WriteLine("Sequence completed")) после того, как все элементы в исходном списке были соблюдены ?
  • Обратите внимание, что .ToObservable происходит от IEnumerable (в данном случае List<>)
  • А подписка запускается на NewThread

1 Ответ

3 голосов
/ 27 сентября 2011

Проблема в том, что 2-й параметр для .Subscribe является ошибкой обратного вызова. Ваша строка «последовательность завершена» будет напечатана только в случае ошибки при наблюдении за элементами.

Вот исправленный код:

var list = new List<int> { 1, 2, 3 };
var obs = list.ToObservable();
var subscription = obs.SubscribeOn(Scheduler.NewThread).Subscribe(p =>
    {
        Console.WriteLine(p.ToString());
        Thread.Sleep(200);
    },
    error => Console.WriteLine("Error!"),
    () => Console.WriteLine("sequence completed"));
Console.ReadLine();
subscription.Dispose();
...