はい、Microsoftのリアクティブフレームワークを使用します。それはまさにこの種のもののために設計されました。
はこれを試してみてください:
var urls = new []
{
"http://www.microsoft.com",
"http://www.google.com",
"http://www.apple.com"
};
var query =
from url in urls.ToObservable()
from html in Observable.Using(
() => new System.Net.Http.HttpClient(),
client => Observable.FromAsync(() => client.GetStringAsync(url)))
select new { url, html };
IDisposable subscription =
query
.ObserveOn(Scheduler.Default)
.Subscribe(
result =>
{
/* Process each `result.url` & `result.html`
as they come in */
},
exception => { /* handle exception */ },
() => { /* All done successfully */ });
これは、すべてのマルチスレッドと非同期です。作成された各HttpClient
は適切に処理され、各結果はできるだけ早く取り込まれます。 .ObserveOn(Scheduler.Default)
は、WinFormsの場合は.ObserveOn(formInstance)
、WPFの場合は.ObserveOnDispatcher()
に置き換えて、UIスレッドで結果を処理します。
基本ビットの場合はNuGet "System.Reactive"、WinFormsビットの場合は "System.Reactive.Windows.Forms"、WPFビットの場合は "System.Reactive.Windows.Threading"。
Parallel.ForEachを実行するだけで、ループごとにアトミックな整数が増え、UIが更新されます。 – DogeAmazed