2016-08-24 4 views
0

javascript/ajax로 호출하기 위해 비동기 끝점 (.NET C#)을 구현하려고합니다. 기본 아이디어는 여러 스레드에서 요청을 동시에 (> 2) 나누어 사용자가 모든 호출에서 개별적으로 응답을 얻고 각 요청의 실행 시간이 실제 계산 (또는 대기) 시간에 해당하도록하는 것입니다. 동시에 비동기 끝점을 호출하는 자바

public async Task<ActionResult> Call1() 
{ 
    var client = new HttpClient(); 
    var res = await client.GetAsync("http://httpbin.org/delay/3"); // Takes 3 seconds 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

public async Task<ActionResult> Call2() 
{ 
    var client = new HttpClient(); 
    var res = await client.GetAsync("http://httpbin.org/delay/2"); // Takes 2 seconds 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

는의 브라우저가 동시에 방법 Call1 싶게 Call2를 요청하는 가정하자. 두 통화가 모두 종료 될 때까지 (Call1 (3sec) + Call2 (2sec)) 약 5 초가 걸립니다. 내가 이해하는 한, 이것은 .NET이 비동기 메서드를 사용하여 동시에 호출되었지만 .NET이 비동기 메서드를 처리하고 Call1을 처리하기 전에 Call1이 끝날 때까지 기다리는 것을 의미합니다. 그건 내가 원하는 것이 아니야. 두 서비스 (3 초는 + 2 초)이 호출되지만

request times call1/call2

제가 정확하게 단지 3 초 정도 이하의 방법에 나타낸 바와 같이 다양한 방법으로 동일한 결과를 달성 할 :

public async Task<ActionResult> Delay() 
{ 
    var client1 = new HttpClient(); 
    Task<HttpResponseMessage> async1 = client1.GetAsync("http://httpbin.org/delay/3"); 

    var client2 = new HttpClient(); 
    Task<HttpResponseMessage> async2 = client2.GetAsync("http://httpbin.org/delay/2"); 

    HttpResponseMessage result1 = await async1; 
    HttpResponseMessage result2 = await async2; 

    return View("~/Views/Dashboard/Test.cshtml"); 
} 

다른 스레드를 차단하지 않고 동시에 여러 메서드를 처리 할 수 ​​있습니까?

도움 주셔서 감사합니다. vill

+0

"지금까지 내가 이해,이 .NET 동기를 처리하고 Call2을 처리하기 전에 종료 Call1을 기다리는 의미 읽기 메서드 "가 올바르지 않다고 생각하십시오. –

+0

[C# Parallel.ForEach 루프 작성 방법] (https://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx) – user5226582

+0

@ user5226582 : 여러 가지 방법으로 로직을 분리해야하기 때문에 Parallel-Class를 사용할 수 없습니다. – vill

답변

0

왜냐하면 5 초가 걸리는 이유는 result1을 먼저 기다린 후 result2를 기다리고 있기 때문입니다. 작업 목록을 만들기 위해 코드를 수정하고 수정 한 다음 Task.WhenAll을 사용하여 모든 작업을 기다립니다. 그들은 비동기과 동시에 불렸다하지만, 더 약 Task.WhenAllhere

public async Task<ActionResult> Delay() 
{ 
    var tasks= new List<Task>(); 

    var client1 = new HttpClient(); 
    tasks.Add(client1.GetAsync("http://httpbin.org/delay/3")); 

    var client2 = new HttpClient(); 
    tasks.Add(client2.GetAsync("http://httpbin.org/delay/3")); 

    await Task.WhenAll(tasks); 

    return View("~/Views/Dashboard/Test.cshtml"); 

가}

관련 문제