Так что у меня нет опыта работы с Rx, но я верю, что все, что Subscribe
делает, это регистрирует, что делать, когда излучение наблюдается. Если ваша наблюдаемая никогда не излучает (ie Empty
или Never
), тогда метод никогда не вызывается. Приложение не ждет окончания самой подписки. Если вы хотите ждать вечно, вы должны использовать что-то вроде
Observable.Never<string>().Wait();
Это связано с тем, что вам не следует использовать асинхронную операцию c в Subscribe
. Возьмите следующий код
static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
}
static async Task DoTheThing(int x)
{
await Task.Delay(TimeSpan.FromSeconds(x));
Console.WriteLine(x);
}
При запуске приложение сразу напишет «выполнено» и выйдет после помещения значений в наблюдаемое, потому что оно не знает о подписчике в контексте того, завершило ли оно свою обработку или не. Надеюсь, я ясно дал понять, и если кто-то с большим знанием Rx захочет вмешаться, если потребуется, это будет хорошо.