Вы должны использовать Microsoft Reactive Framework (он же Rx) - NuGet System.Reactive
и добавить using System.Reactive.Linq;
- тогда вы можете сделать это:
var query =
from n in Observable.Range(0, 5)
from r in Observable.Using(
() => new WebClient(),
wc => Observable.Start(() => wc.DownloadString($"{url}{n}")))
select new { n, r };
IDisposable subscription =
query
.ToArray()
.Select(xs => xs.OrderBy(x => x.n).Select(x => x.r).ToArray())
.Subscribe(rs =>
{
/* Do something with the results */
});
Это все многопоточное и неблокирующее.
Если вас не волнует порядок, в котором возвращаются результаты, просто сделайте следующее:
var query =
from n in Observable.Range(0, 5)
from r in Observable.Using(
() => new WebClient(),
wc => Observable.Start(() => wc.DownloadString($"{url}{n}")))
select r;
IDisposable subscription =
query
.Subscribe(r =>
{
/* Do something with each result */
});
Вызов subscription.Dispose()
остановит запрос, если вам нужно отменить его.
Вы можете написать свой MakeRequestAsync
метод следующим образом:
public static async Task<String> MakeRequestAsync(String url)
{
return await
Observable.Using(
() => new WebClient(),
wc => Observable.Start(() => wc.DownloadString(url)));
}