2016-04-30 15 views
0

我正在創建一個需要todo並行http請求的應用程序,我正在使用HttpClient。 我正在遍歷URL和foreach URl我開始一個新的任務todo請求。循環後,我等待,直到每個任務完成。 但是,當我檢查正在使用提琴手進行的調用時,我發現請求正在被同步調用。這並不像一大堆請求正在制定,而是一個接一個。 我搜索了一個解決方案,發現其他人也經歷過這一點,但與UWP無關。解決方案是增加ServicePointManager上的DefaultConnectionLimit。 問題是,UWP不存在ServicePointManager。我查看過API,我想我可以在HttpClientHandler上設置DefaultConnectionLimit,但是沒有。在UWP應用程序中的並行httprequest

所以我有幾個問題。 DefaultConnectionLimit仍然是一個可以在某處設置的屬性? 如果是這樣,我在哪裏設置?如果不是,我該如何增加連接限制? UWP中還有一個連接限制嗎?

這是我的代碼:

var requests = new List<Task>(); 
var client = GetHttpClient(); 
foreach (var show in shows) 
{ 
    requests.Add(Task.Factory.StartNew((x) => 
    { 
     ((Show)x).NextEpisode = GetEpisodeAsync(((Show)x).NextEpisodeUri, client).Result;}, show)); 
    } 
} 
await Task.WhenAll(requests.ToArray()); 

,這是請求:

public async Task<Episode> GetEpisodeAsync(string nextEpisodeUri, HttpClient client) 
{ 
    try 
    { 
     if (String.IsNullOrWhiteSpace(nextEpisodeUri)) return null; 
     HttpResponseMessage content; = await client.GetAsync(nextEpisodeUri); 
     if (content.IsSuccessStatusCode) 
     { 
      return JsonConvert.DeserializeObject<EpisodeWrapper>(await content.Content.ReadAsStringAsync()).Episode; 
     } 
    } 
    catch (Exception ex) 
    { 

     Debug.WriteLine(ex.Message); 
    } 

    return null; 
} 
+0

你可能想知道爲什麼我不使用異步/地等待着任務。當我使用它時,我的結果非常快。但問題在於Task.WhenAll不會等到所有任務完成。當我調試時,我仍然看到通過Task.WhenAll後進行的調用。也許問題出在那裏。有沒有辦法讓Task.WhenAll等待,直到所有的任務完成使用異步/等待任務? –

回答

0

奧凱。我有解決方案。我確實需要在任務內使用異步/等待。問題在於我使用StartNew而不是Run。但我必須使用StartNew,因爲我正沿着一個狀態傳遞。 使用StartNew。除非您打開Unwrap,否則不會等待任務內的任務。所以Task.StartNew(.....)。Unwrap()。這樣Task.WhenAll()將等待直到內部任務完成。 當你使用Task.Run()時,你不必這樣做。

Task.Run vs Task.StartNew

The stackoverflow answer

var requests = new List<Task>(); 
var client = GetHttpClient(); 
foreach (var show in shows) 
{ 
    requests.Add(Task.Factory.StartNew(async (x) => 
    { 
     ((Show)x).NextEpisode = await GetEpisodeAsync(((Show)x).NextEpisodeUri, client); 
    }, show) 
    .Unwrap()); 
} 
Task.WaitAll(requests.ToArray()); 
+0

這是驚人的把戲。 –

+0

@Sebastian S您可以請添加新的示例代碼。 –