public async Task <T> Run <T>(IFlurlClient baseRequest, JsonContent bodyContent, ExecuteRequestAsync <T> executeRequestAsync) { var accessToken = GetAccessToken(baseRequest); LeakyBucket bucket = null; if (accessToken != null) { bucket = _shopAccessTokenToLeakyBucket.GetOrAdd(accessToken, _ => new LeakyBucket()); } while (true) { var request = baseRequest.Clone(); var content = bodyContent?.Clone(); if (accessToken != null) { await bucket.GrantAsync(); } try { var fullResult = await executeRequestAsync(request, content); var bucketState = this.GetBucketState(fullResult.Response); if (bucketState != null) { bucket?.SetState(bucketState); } return(fullResult.Result); } catch (ShopifyRateLimitException) { //An exception may still occur: //-Shopify may have a slightly different algorithm //-Shopify may change to a different algorithm in the future //-There may be timing and latency delays //-Multiple programs may use the same access token //-Multiple instances of the same program may use the same access token await Task.Delay(THROTTLE_DELAY); } } }
public async Task <T> Run <T>(IFlurlClient baseRequest, JsonContent bodyContent, ExecuteRequestAsync <T> executeRequestAsync) { while (true) { var request = baseRequest.Clone(); var content = bodyContent?.Clone(); try { var fullResult = await executeRequestAsync(request, content); return(fullResult.Result); } catch (ShopifyRateLimitException) { await Task.Delay(RETRY_DELAY); } } }