2017-10-26 17 views
0

私が手にしている問題をどのように攻撃するのかという問題を理解しています。API呼び出しを非同期で行います

私は多くの製品を含むウェブサイトを持っており、これらのページに製品を埋め込むために、APIプロバイダGetProductsというメソッドを呼び出します。これはうまくいきますが、私はこの要求をより小さなリクエストに分割して非同期に実行することで、このプロセスをスピードアップしたいと考えています。 GetProductsメソッドはpageNumberパラメータを提供しています。これを使用すると、別のページのレコードを取得することができます。

私はこれを解決するさまざまな方法を試しましたが、私はどこにもいません。コード例:

int n = 0; 
var tasks = new List<Task>(); 

// this method gets the total amount of products for the category 
totalAmountOfProducts = MyApi.GetProductsCount(category); 

while (n < totalAmountOfProducts/200) 
{ 
    for (int i = 0; i < 10; i++) 
    { 
     tasks.Add(GetProductsAsync(category, i, 200)); 
    } 

    n += i; 
    Task t = Task.WhenAll(tasks.ToArray()); 
    var totalProducts = // add products from the last 10 iterations to total in some way 
} 

private async Task<ProductList> GetProductsAsync(string category, int pageNumber, int productAmount) 
{ 
    return await Task.Run(() => MyApi.GetProducts(category, pageNumber, productAmount)) 
} 

どうすればよいですか?私は3つの異なるバージョンを試しましたが、それらはすべてエラーで終わるか、何もしません。しかし、私はこれが完全に間違っていると認識しています...たとえば、私はawaitGetProductsAsyncの方法で実行しています。これは、正しく理解していればTask t = Task.WhenAll(tasks.ToArray())行の目的を破棄しますが、すべてを取り除く唯一の方法でしたタイプProductListSystem.Actionに変換できなかったというエラーメッセージが表示されます。

+0

'GetProductsAsync(category、i、200)'の結果で何もしていないようです。 – Igor

+2

'Parallel.ForEach'の仕事のように聞こえます。オプションとしてカスタムパーティショナーもあります。 'async'は非同期であり、(主に)並列処理ではありません。動作させても、ここで説明した非同期オーバーラップラッパーではあまり楽しめません。 –

+0

@Fildor申し訳ありませんが、コードをコピーするときに書き留めました。修正しました。 @Jeroen Mostert hmm ...私は彼らが同じことだと思っていたのですか?間違いなく 'Parallel.ForEach'を調べます! – daveudou88

答えて

2

あなたはTask.WhenAllの前でのawaitキーワードを入れてください。

var result = await Task.WhenAll(tasks.ToArray()); 

タスクを待っていない場合は、コードはタスクが完了していない= ..同期したときに代入文のvar totalProductsを実行しますこれは結果を出さないか、例外をスローします。

+0

コードが表示されないため、*そのコードが何をするのか分かりません。たぶん同期的に待つかどうかは、結果を非同期的に取得するか、タスクが完了していないために間違った結果が得られる可能性があります。 – Servy

関連する問題