2017-06-04 9 views
-1

数字のリストを含むファイルをアップロードしています。リクエストはファイル内の各番号に対して送信されます。私は一回forループでリクエストを送信しようとしましたが、一度asyncで待っていれば、私の驚きはループが速くなりました。以下はコードです。複数のリクエストが非同期であり、待ち時間が長くなるとループします。

public async Task<ActionResult> IndexWithThread() { 

     messageStatus = new MessageStatus(); 
     if (Request.Files["msisdnlist"] != null) 
     { 
      Task st1; 
      List<Task> task = new List<Task>(); 
      StreamReader file = new StreamReader("C:\\Users\\SUMAN\\Desktop\\msisdn.txt"); 
      while ((line = file.ReadLine()) != null) 
      { 
       string url = "api/sendmessage/" + line; 
       st1 = ProcessRequest(url, client); 
       task.Add(st1); 

      } 
      await Task.WhenAll(task.ToArray()); 
      watch.Stop(); 
      file.Close(); 

     } 
     return View("Index", messageStatus); 
    } 

    private async Task ProcessRequest(string url,HttpClient client) { 

     var response = await client.GetAsync(url); 
     int status = GetStatusCode(response.StatusCode.ToString()); 
     if (status == 200) 
      success++; 
     else 
      failed++; 
     count++; 

     timeTaken = watch.Elapsed.ToString(); 

    } 

ここでリクエスト方法があります。

public HttpResponseMessage Get(int id) 
    { 
     Thread.Sleep(5000); 
     int randomNum =GetRandomResponse(); 
     if(randomNum==1) 
      return Request.CreateResponse(HttpStatusCode.OK, "Succeessfully send message to msisdn "+id); 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Error sending message to msisdn "+id); 
    } 

どこが間違っていますか?また、このような状況では、複数の要求を処理する最良のオプションは何でしょうか?ループコード

 public ActionResult Index() 
     { 
     var watch = Stopwatch.StartNew(); 
     string line; 
     int success=0; 
     int failed = 0; 
     int count =0; 
     MessageStatus messageStatus = new MessageStatus(); 

     if (Request.Files["msisdnlist"] != null) 
     { 
      StreamReader file = new StreamReader("C:\\Users\\ADMIN\\Desktop\\msisdn.txt"); 
      while ((line = file.ReadLine()) != null) 
      { 
       string url = "api/sendmessage/"+line; 
       var response = client.GetAsync(url).Result; 
       //Response.StatusCode = GetStatusCode(response.StatusCode.ToString()); 
       int status = GetStatusCode(response.StatusCode.ToString()); 
       if (status == 200) 
        success++; 
       else 
        failed++; 
       count++; 
      } 
      watch.Stop(); 
      string timeTaken = watch.Elapsed.ToString(); 
      file.Close(); 

      messageStatus.Success = success; 
      messageStatus.Failed = failed; 
      messageStatus.TimeTaken = timeTaken; 
      messageStatus.MsisdnCount = count; 

     } 
     return View(messageStatus); 

    } 

ため

EDIT

ザIは、要求を遅延させる)(のThread.sleep添加。 2つの方法の間に時間差はあまりありません。非同期にはもう少し時間がかかります。

+0

なぜこの 'Thread.Sleep(5000)';とにかく、実際の時差と同じように、結果についてもっと分かち合うことができますか?そして完全にするには、ループバリアントのコードも投稿してください。最後に、ストップウォッチをどこで始めるのですか? –

+0

投稿が更新されました@PeterBons – suman

答えて

-3

同じコードブロックに2つのreturn文が含まれているので、getメソッドを変更します。

public HttpResponseMessage Get(int id) 
    { 
     Thread.Sleep(5000); 
     int randomNum =GetRandomResponse(); 
     if(randomNum==1) 
{ 
      return Request.CreateResponse(HttpStatusCode.OK, "Succeessfully send message to msisdn "+id); 
} 
     return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Error sending message to msisdn "+id); 
    } 
+2

これは2つのreturn文を持ちますが、条件がtrueの場合は最初の戻り値が動作し、制御が2番目の戻り値に達することはありません。 – suman

+0

これは関連しておらず、コード自体が正しいです。 –

関連する問題