public virtual void Push(T value)
        {
            Node node = new Node(value);

            while (true)
            {
                if (TryPush(node))
                {
                    return;
                }
                else
                {
                    backoff.DoBackoff();
                }
            }
        }
Esempio n. 2
0
        public virtual void Push(T value)
        {
            Node node = new Node(value); //создаем новую ноду

            while (true)
            {
                if (TryPush(node)) //если попытка положить прошла удачно
                {
                    return;        //пуш завершается
                }
                else
                {
                    backoff.DoBackoff(); //иначе пытаемся положить через некоторое время
                }
            }
        }
Esempio n. 3
0
        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);
        }
Esempio n. 4
0
        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);
        }