私が手にしている問題をどのように攻撃するのかという問題を理解しています。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つの異なるバージョンを試しましたが、それらはすべてエラーで終わるか、何もしません。しかし、私はこれが完全に間違っていると認識しています...たとえば、私はawait
をGetProductsAsync
の方法で実行しています。これは、正しく理解していればTask t = Task.WhenAll(tasks.ToArray())
行の目的を破棄しますが、すべてを取り除く唯一の方法でしたタイプProductList
をSystem.Action
に変換できなかったというエラーメッセージが表示されます。
'GetProductsAsync(category、i、200)'の結果で何もしていないようです。 – Igor
'Parallel.ForEach'の仕事のように聞こえます。オプションとしてカスタムパーティショナーもあります。 'async'は非同期であり、(主に)並列処理ではありません。動作させても、ここで説明した非同期オーバーラップラッパーではあまり楽しめません。 –
@Fildor申し訳ありませんが、コードをコピーするときに書き留めました。修正しました。 @Jeroen Mostert hmm ...私は彼らが同じことだと思っていたのですか?間違いなく 'Parallel.ForEach'を調べます! – daveudou88