数字のリストを含むファイルをアップロードしています。リクエストはファイル内の各番号に対して送信されます。私は一回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つの方法の間に時間差はあまりありません。非同期にはもう少し時間がかかります。
なぜこの 'Thread.Sleep(5000)';とにかく、実際の時差と同じように、結果についてもっと分かち合うことができますか?そして完全にするには、ループバリアントのコードも投稿してください。最後に、ストップウォッチをどこで始めるのですか? –
投稿が更新されました@PeterBons – suman