Я пытаюсь уведомить слушателей, которые подписались на Subject _sub
из другого наблюдаемого, и после этого записать какое-то сообщение в обработчик Do
. Я вызываю OnNext, и все бы работало нормально, если бы _sub
не было асинхронным. Проблема здесь в том, что нет функции OnNextAsync, которую я бы ждал в первом наблюдаемом. Как лучше всего это сделать?
class Program
{
private static Subject<int> _sub = new Subject<int>();
static void Main(string[] args)
{
_sub.SelectMany(async _ =>
{
Console.WriteLine("SUB START: " + _);
await Task.Delay(3000);
Console.WriteLine("SUB END: " + _);
return 1;
}).Subscribe();
Start();
}
public static void Start()
{
int count = 0;
Observable.Interval(TimeSpan.FromSeconds(5)).Select(x =>
{
Console.WriteLine("START INTERVAL");
_sub.OnNext(count++); //onNext is not awaitable
Console.WriteLine("END INTERVAL");
return 1;
})
.Do(_ => Console.WriteLine("ALL FINISHED"))
.Subscribe();
Console.WriteLine("READLINE");
Console.ReadLine();
}
}
Результат:
READLINE
START INTERVAL
SUB START: 0
END INTERVAL
ALL FINISHED
SUB END: 0
Ожидаемый результат:
READLINE
START INTERVAL
SUB START: 0
SUB END: 0
END INTERVAL
ALL FINISHED
ForEachAsync
для наблюдаемых, который выполняет асинхронное действие для каждого значения последовательности и может ожидать завершения самой последовательности и всех асинхронных действий. Вы можете найти реализацию здесь а>. - person Theodor Zoulias   schedule 29.11.2020