2016-08-24 36 views
0

我想實現異步端點(.NET C#)以便用javascript/ajax調用它們。基本思想是在多個線程中拆分請求(同時> 2),以便用戶從每個調用中分別得到響應,並且每個請求的執行時間與實際的計算(或等待)時間相對應。Javascript同時調用異步端點

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(3秒)+ Call2(2秒))大約需要5秒。據我所知,這意味着.NET處理它們是同步的,並在處理Call2之前等待Call1結束,儘管它們在同一時間被異步方法調用。這不是我想要的。

request times call1/call2

我想要實現與多個方法相同的結果顯示在下面的方法,該方法正確地只需要3秒,儘管這兩個服務(3秒+ 2秒)被稱爲:

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處理它們同步,並等待處理CALL1前CALL2結束,雖然他們在同一時間與異步叫方法「不認爲這是正確的 –

+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"); 

}