2016-04-30 6 views
0

私はこれを行うためにHttpClientを使用しています。 私はURLをループしていますし、foreach URl私は要求を行うために新しいタスクを開始します。ループの後に私はすべてのタスクが終了するまで待つ。 しかし、私はファイトラーで行われている呼び出しをチェックするとき、私は要求が同期的に呼び出されていることがわかります。それは要求の束が作られているのと同じではなく、一つずつあります。 私は解決策を探して、他の人もこれを経験したが、UWPでは経験していないことを発見しました。ソリューションはServicePointManagerのDefaultConnectionLimitを増やすことでした。 問題は、ServicePointManagerがUWPに対して存在しないことです。私は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

私は仕事で非同期/のawaitを使用していないなぜあなたは不思議に思うかもしれません。私がそれを使うとき、私は結果をかなり早く得る。ただし、問題は、すべてのタスクが完了するまでTask.WhenAllが待機しないことです。私がデバッグすると、私はTask.WhenAllを渡した後も依然として呼び出しが行われています。おそらく問題がそこにあるかもしれません。タスクで非同期/待機を使用してすべてのタスクが完了するまでTask.WhenAllを待つ方法がありますか? –

答えて

0

おけ。私には解決策がある。私は、タスク内で非同期/待機を使用する必要があります。問題は、Runの代わりにStartNewを使用していたという事実でした。私は州に沿って渡っているので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新しいサンプルコードを追加できますか? –

関連する問題