Это не блокировка, потому что это хорошо - асинхронно. Ваш код генерирует пять задач, все они выполняются параллельно, все выполняются в разное время.
Но они не блокируют функцию Main
. Если вы просто добавите Console.ReadKey()
в качестве последней строки, вы увидите, что ваш код работает в фоновом режиме. Он печатает.
static void Main(string[] args)
{
Observable.Range(1, 5).Subscribe(async x => await DoTheThing(x));
Console.WriteLine("done");
Console.ReadKey();
}
Но предположим, что вы хотите подождать, пока все они не будут выполнены. Что тогда?
Конечно, есть .Wait()
, но это блокировка. Давайте рассмотрим все наши задачи как наблюдаемые.
Мы будем использовать C# 7 async Main
, пока мы на нем.
static async Task Main(string[] args)
{
await Observable.Range(1, 5)
.Select(x => DoTheThing(x).ToObservable())
.Merge();
Console.WriteLine("done");
}
Это работает точно так, как вы ожидаете это к.