2016-05-18 9 views
0

異なる日付範囲の単一のWebサービスへの一連の呼び出しを行い、連結結果セットを生成する必要があります。この分野での経験は限られていますが、プロセスをスピードアップするためにコールを並行して行いたいと思います。コードはLinqPadで並列に実行されますが、コンソールアプリケーションでは実行されません...なぜですか?

私はいくつかの手法を試しましたが、実行時間に基づいて、私のコードコールはVisul Studioコンソールアプリケーションで実行すると順番に実行され続けます。これは、1か月の日付範囲のコールに15秒かかる場合、並行して実行されていると思われる3つのコールのうちの3つが45秒かかると言います。

ここで私は本当に驚いた部分です:簡単なデバッグのためにLinqPadで全く同じコードを実行し始めました。 Linと同じコードがLinqPadで並行して実行されています。 3ヶ月間の呼び出しには合計約15秒かかります!

今、私はこれがどうなるかについて頭を悩ましています。私はLinqPadのバージョンを新しいconoleプロジェクトにコピーしようとしましたが(実際には両方のバージョンですべてが同じであることを二重チェックするために)、動作は変わりません。

私はどんな提案もありがとうございます。私はこの問題に関連しているコードはわからないんだけど、私は、以下のWebサービスの呼び出し元のクラスのやや簡略化されたバージョンを含めました:あなたのコンソールアプリケーションの起動時に

class Importer 
{ 
    public List<FuncDetails> GetAllData(DateRange[] intervals) 
    { 
     Task<List<PropFuncsType>>[] tasks = intervals 
      .ToList() 
      .Select(interval => GetDataForIntervalAsync(interval.StartDate, interval.EndDate)) 
      .ToArray(); 

     var result = new List<ResultDataTable>(); 
     Task.Factory.ContinueWhenAll(tasks, results => { foreach (var output in results) { result.AddRange(output.Result); } }) 
     .Wait(); 

     return result.SelectMany(x => x.ResultDataRow).ToList(); 

    } 

    async static private Task<List<ResultDataTable>> GetDataForIntervalAsync(DateTime startDate, DateTime endDate) 
    { 
     var service = new ServiceClient(); 

     var result = await service.getDataAsync(new ServiceRequest() 
      { 
       startDate = string.Format("{0:yyyy-MM-dd}", startDate), 
       endDate = string.Format("{0:yyyy-MM-dd}", endDate) 
      } 
     ); 

     return result.ServiceResponse.ToList(); 
    } 
} 
+0

あなたは 'ServicePointManager.DefaultConnectionLimit'をチェックしましたか? –

+0

それだけです! 'ServicePointManager.DefaultConnectionLimit'は実質的にグローバルであり、LinqPadホストは自分のコードの外でそれを高い値に設定する必要があります。私は2日間頭を叩いていた。私はあなたに適切なクレジットを与えることができるようにあなたのコメントを回答してください! –

答えて

2

int.MaxValueServicePointManager.DefaultConnectionLimitを設定してみてください。これは、.NETでのHTTPスロットルの一般的ではあるが微妙な原因です。

(おそらく、LINQPadは既に何か類似している)

+1

デフォルト値(2)から値を増やしたのはまさに答えでした。私は当初、それを私のケースでは24を超えた値に設定していましたが、誤って自分のWebサービスプロバイダーに対するDoS攻撃に陥りました。 :-)大きな力で大きな責任がもたらされ、私の制限では、おそらく私の呼び出しコードで明示的に管理されていると思います。乾杯。 –

関連する問題