2017-06-23 5 views
1

私は、Webサービスをテストするために、多くの同時ユーザー(> 2000)をシミュレートしようとしています。多くのparrallel WebRequestsを送信

  • ユーザーA:9時10分02秒、午前9時10分03秒、午前9時10分08秒
  • ユーザB:9:10すべてのユーザーは、例えば、特定の事前定義された時間にアクションを実行します:03、午前九時十分05秒、9時10分07秒
  • ユーザーC:午前9時10分03秒、9時10分09秒、9時10分15秒、午前9時10分20秒

Iそれぞれの時間にリアルタイムでWebリクエストを送信したいと考えています。私は最大でも約2秒の遅延を許容することができます。私はすでに成功せずにしようとしていた:

a)の集計を時間でソート単一のリスト内のすべての時間、それはそれを反復:

foreach (DateTime sendTime in times) { 
    while (DateTime.now < sendTime) 
     Thread.Sleep(1); 
    SendRequest(); 
} 

b)の各スレッドのチェックと、各ユーザーのスレッドを作成します。上記と同じ条件で長時間の睡眠時間の場合

どちらの方法も近づきますが、要求が送信されるはずの時間と実際に送信された時間の差が大きすぎます。より精度の高い要求を送信する方法はありますか?

編集:アプローチは本当にうまくいっています。しかし、遅延は依然として多くの要求に対して非常に高い。 Apparantly、この理由は、私のsendRequest()メソッドです:私のWebサービスは、任意の応答を返さない

private static async Task SendRequest() 
{ 
    // Log time difference 
    string url = "http://www.request.url/newaction"; 
    WebRequest webRequest = WebRequest.Create(url); 
    try 
    { 
     WebResponse webResponse = await webRequest.GetResponseAsync(); 
    } 
    catch (Exception e) { } 
} 

注意、多分これはスローダウンした理由は何ですか?回答を待たずにリクエストを送信できますか?

+1

とご質問がありますか? –

+0

私はより具体的な質問を追加しました – aseipel

答えて

2

私は要求をトリガーするタイマーオブジェクトを使用することをお勧め:

// In Form_Load or another init method 
Timer tRequest = new Timer(); 
tRequest.Interval = 500; 
tRequest.Tick += TRequest_Tick; 

private void TRequest_Tick(object sender, EventArgs e) 
{ 
    var sendTimes = times.Where(t => t.AddMilliseconds(-500) < DateTime.Now && t.AddMilliseconds(500) > DateTime.Now); 

    foreach(DateTime sendTime in sendTimes) 
    { 
     SendRequest(); 
    } 
} 
2

は、なぜあなたは、複数のスレッドでこれをやっていますか?スレッディングには、スロースリープ/ウェイクコンテキスト切り替えが必要です。これをタイマー/非同期呼び出しですべて行うことができます。

List<DateTime> scheduledTimes = ...; 
List<Task> requests = scheduledTimes 
         .Select(t => t - DateTime.Now) 
         .Select(async delay => 
         { 
          await Task.Delay(delay); 
          SendRequest(); 
         }) 
         .ToList(); 

await Task.WhenAll(requests); 

上記のコードは、すべてのリクエストをSynchronizationContextにスケジュールして実行します。

シンプル。

+0

ありがとう、これは本当にうまくいきます。しかし、私のSendRequest()メソッドのために、依然として多くのリクエストでかなり遅れています。私は詳細については私のポストを編集しました。 – aseipel

+1

@aseipel実際には、connectionManagerの制限を打つことが理由だと思います。また、httpサーバの限界にぶつかっている可能性もあります(非サーバのWindows上のIISは意図的に接続制限で悩まされています)。 – Aron

+0

これに該当するかどうかどうすれば確認できますか?私はすでに私のApp.configのmaxconnection属性、私のサービスのIIS接続制限、およびアプリケーションプールのqueueLengthを増やしました。 – aseipel

関連する問題