2017-11-05 5 views
0

私は約1000件のWebリクエストを開始し、結果を処理するWinformアプリケーションを持っています。私は現在、BackgroundWorkerを使用しています。これは、URLリストをループし、HTTPClientで順番に要求し、結果を処理し、BackgroundWorker.ReportProgressで進行状況をユーザーインターフェイスに報告します。複数のURLを一度にダウンロードします(ユーザーインターフェイスをブロックせずに進捗状況を報告します)

これはうまくいきますが、複数のURLを一度にリクエストすることでこれをスピードアップしたいと思います。それでも進行状況が報告され、ユーザーインターフェイスをブロックしてはいけません。私はスレッドを作成して自分ですべて行うことができますが、魅力的な.NET機能を備えたより良いソリューションがあると確信しています。どんな助けもありがとうございます。

+0

Parallel.ForEachを実行するだけで、ループごとにアトミックな整数が増え、UIが更新されます。 – DogeAmazed

答えて

2

はい、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"。

関連する問題