Вы должны использовать Microsoft Reactive Framework (он же Rx) - NuGet System.Reactive
и добавить using System.Reactive.Linq;
- тогда вы можете сделать это:
void Main()
{
var query =
from n in Observable.Range(0, 25)
from v in Observable.FromAsync(() => GetValueAsync())
select v;
query.Take(1).Subscribe(x => Console.WriteLine(x));
}
private Random _random = new Random();
public async Task<int> GetValueAsync()
{
var value = _random.Next(5, 100);
Console.WriteLine($"!{value}");
await Task.Delay(TimeSpan.FromSeconds(value));
return value;
}
В итоге вы получите простой запрос, который вы можете использовать .Take(1)
, чтобы завершить первое значение. Это приятно, чисто и просто.
Если вы опубликуете, как вы создаете задачи, я могу опубликовать полный ответ.