#c# #system.reactive
#c# #system.reactive
Вопрос:
В качестве отправной точки приведено следующее:
using System;
using System.Reactive.Linq;
using System.Reactive;
using System.Threading;
public class Program
{
public static void Main()
{
Observable
.Range(0, 3)
.Select((iteration) =>
{
try
{
if (iteration == 2)
{
throw new Exception();
}
return "Success!";
}
catch(Exception ex)
{
Console.WriteLine("Caught!");
return "Exception!";
}
})
.Do((message) =>
{
Console.WriteLine("After: " message);
})
.RunAsync(new CancellationToken())
.Wait();
}
}
Могу ли я каким-либо образом адаптировать приведенное выше для использования Catch
оператора таким образом, чтобы 2-я итерация не приводила к сбою всей цепочки? Возможно, используя SelectMany
или Select
и Merge
?
Комментарии:
1. Вы уверены, что это не удается? AFAICS наблюдаемое завершается успешно.
2. Да, я знаю, что это работает. Мой вопрос в том, можно ли это адаптировать для использования операторов Catch.
3.
Catch
Оператор работает с ошибочными последовательностями. Он объединяет вторую последовательность после неудачной. Итак, чтобы использовать этот оператор, вы должны разрешить сбой вашей последовательности, а затем продолжить с новой последовательностью, которая содержит все элементы, которые не были испущены первой последовательностью. Все может запутаться. Я не думаюCatch
, что в этом случае вы что-то покупаете.4. Александр, я сожалею об этом. Я просто пытался быть забавным. Пожалуйста, проигнорируйте мой предыдущий комментарий.
5. @Enigmativity OP, вероятно, использует real (cancelable)
CancellationToken
в своем реальном приложении в качестве механизма для отмены последовательности.