Я создал ReactiveAsyncCommand (SL5) и не смог получить подписку для запуска метода OnError. Вот код

        Start1Command = new ReactiveAsyncCommand();
        Start1Command.RegisterAsyncObservable(_ => this.Start())
            .Subscribe<int>(
                u => Debug.WriteLine("OnNext-->" + u.ToString()),
                ex => Debug.WriteLine("OnError-->" + ex.Message),
                () => Debug.WriteLine("OnComplete-->")
            );
        Start1Command.Execute(null);

И код для запуска

 public IObservable<int> Start()
 {
     return Observable.Start(() =>
         {
            throw new Exception("Exception");
            return 42;
         },
         RxApp.TaskpoolScheduler);
 }

Когда я запускаю этот код, я получаю исключение из инфраструктуры ReactiveUI, которое предлагает мне подписаться на ThrownExceptions. Когда я это сделаю, исключение, которое я выбрасываю выше, обрабатывается правильно.

 Start1Command.ThrownExceptions.Subscribe(ex => Debug.WriteLine("ThrownExceptions OnNext-->" + ex.Message));

Должен ли я ожидать, что подписка на команды вызовет OnError? или мне нужно использовать ThrownExceptions.

2
DouglasWoods 27 Дек 2012 в 06:32

1 ответ

Лучший ответ

Обычно ваши ожидания полностью оправдываются. Однако RegisterAsync* эффективно перехватывает OnError. Это упрощает программирование против RegisterAsync, поскольку после того, как вы обработали OnError один раз в Subscribe, он больше никогда не будет работать. Обработка ThrownExceptions означает, что вам не нужно заниматься повторной подпиской.

Если это не имеет смысла, не беспокойтесь об этом, просто обработайте ThrownExceptions и предположите, что подписчик получает только OnNext

3
Ana Betts 27 Дек 2012 в 10:54
Ожидается ли поведение, что я должен подписаться на ThrownExceptions и команды, указав лямбда-выражение OnError в RegisterAsyncTask (). Subscribe ()? Если я опущу лямбда-выражение OnError (которое в любом случае было бы пустым в моем случае), сразу после выполнения и возврата обработчика ThrownExceptions исключение выдается в потоке пользовательского интерфейса (в контексте, где я не могу его поймать). Если оба указаны, оба выполняются, и исключение не генерируется в потоке пользовательского интерфейса.
 – 
Mathieu Frenette
3 Сен 2014 в 01:11
В настоящее время это может быть ожидаемое поведение, но такое ожидаемое поведение - отстой. Вы можете сообщить об ошибке?
 – 
Ana Betts
3 Сен 2014 в 02:48