public virtual void Push(T value) { Node node = new Node(value); while (true) { if (TryPush(node)) { return; } else { backoff.DoBackoff(); } } }
public virtual void Push(T value) { Node node = new Node(value); //создаем новую ноду while (true) { if (TryPush(node)) //если попытка положить прошла удачно { return; //пуш завершается } else { backoff.DoBackoff(); //иначе пытаемся положить через некоторое время } } }
internal Task <JObject> start(Func <bool, Task <JObject> > fetchFn) { var promise = new TaskCompletionSource <JObject>(); var forceOAuth = false; executeFn(); _newBackoff.OnReady = (number, delay) => { _log($"Requesting for url {{ number: {number}, delay: {delay} }}"); executeFn(); }; _newBackoff.OnFail = (err) => throw _lastError; async void executeFn() { try { var result = await fetchFn(forceOAuth); promise.SetResult(result); } catch (Exception err) { _lastError = err; if (RetryableError(err)) { if (errors.isRateLimited(err)) { await Task.Delay(MaxDelay); } else if (errors.isExpiredToken(err)) { forceOAuth = true; } await _newBackoff.DoBackoff(); return; } var e = (err as RestlerOperationException); // Previous error structure if (e != null && e.Content != null && e.Content is JObject && ((JObject)e.Content)["errors"] is JArray) { err = e.StatusCode == HttpStatusCode.Unauthorized || e.StatusCode == HttpStatusCode.Forbidden ? new HootsuiteSecurityException(e.StatusCode, (JObject)((JObject)e.Content)["errors"].FirstOrDefault()) : new HootsuiteException(e.StatusCode, (JObject)((JObject)e.Content)["errors"].FirstOrDefault()); } // New error structure else if (e != null && e.Content != null && e.Content is JObject && ((JObject)e.Content)["error"] is JToken) { err = e.StatusCode == HttpStatusCode.Unauthorized || e.StatusCode == HttpStatusCode.Forbidden ? new HootsuiteSecurityException(e.StatusCode, (JObject)e.Content) : new HootsuiteException(e.StatusCode, (JObject)e.Content); } promise.SetException(err); } } return(promise.Task); }
internal Task <JObject> start(Func <bool, Task <JObject> > fetchFn) { var promise = new TaskCompletionSource <JObject>(); var forceOAuth = false; executeFn(); _newBackoff.OnReady = (number, delay) => { _log($"Requesting for url {{ number: {number}, delay: {delay} }}"); executeFn(); }; _newBackoff.OnFail = (err) => throw _lastError; async void executeFn() { try { var result = await fetchFn(forceOAuth); promise.SetResult(result); } catch (Exception err) { _lastError = err; if (RetryableError(err)) { if (errors.isRateLimited(err)) { await Task.Delay(MaxDelay); } else if (errors.isExpiredToken(err)) { forceOAuth = true; } await _newBackoff.DoBackoff(); return; } promise.SetException(err); throw err; } } return(promise.Task); }