Beispiel #1
0
        private async Task <T> DoWithRetry <T>(DoConnection <T> func, string LogPrefix = "DoWithRetry")
        {
            Random rnd       = new Random();
            var    retry     = 0;
            string error_str = "";

            while (++retry < 30)
            {
                try
                {
                    return(await func());
                }
                catch (HttpRequestException ex)
                {
                    error_str = ex.Message;
                    Config.Log.LogOut("\t[" + LogPrefix + "] " + error_str);

                    if (ex.Message.Contains("401 (Unauthorized)") ||
                        ex.Message.Contains("429 (Too Many Requests)") ||
                        ex.Message.Contains("500 (Internal Server Error)") ||
                        ex.Message.Contains("503 (Service Unavailable)"))
                    {
                        var waitsec = rnd.Next((int)Math.Pow(2, Math.Min(retry - 1, 8)));
                        Config.Log.LogOut("\t[" + LogPrefix + "] wait " + waitsec.ToString() + " sec");
                        await Task.Delay(waitsec * 1000);
                    }
                    else
                    {
                        break;
                    }
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    error_str = ex.ToString();
                    Config.Log.LogOut("\t[" + LogPrefix + "] " + error_str);
                    break;
                }
            }
            throw new SystemException(LogPrefix + " Failed. " + error_str);
        }
Beispiel #2
0
        private async Task <T> DoWithRetry <T>(DoConnection <T> func, CancellationToken ct = default(CancellationToken), string LogPrefix = "DoWithRetry")
        {
            Random rnd       = new Random();
            var    retry     = 0;
            string error_str = "";

            while (++retry < 30)
            {
                ct.ThrowIfCancellationRequested();
                try
                {
                    return(await func());
                }
                catch (HttpRequestException ex)
                {
                    error_str = ex.Message;
                    Log(LogPrefix, error_str);

                    if (ex.Message.Contains("429") ||
                        ex.Message.Contains("500") ||
                        ex.Message.Contains("503"))
                    {
                        var waitsec = rnd.Next((int)Math.Pow(2, Math.Min(retry - 1, 8)));
                        Log(LogPrefix, "wait " + waitsec.ToString() + " sec");
                        await Task.Delay(waitsec * 1000).ConfigureAwait(false);
                    }
                    else if (ex.Message.Contains("401"))
                    {
                        Log(LogPrefix, "auth failed.");
                        var retry_auth = 5;
                        while (retry_auth-- > 0)
                        {
                            ct.ThrowIfCancellationRequested();
                            Auth = await RefreshAuthorizationCode(Auth, ct).ConfigureAwait(false);
                            await EnsureEndpoint(ct).ConfigureAwait(false);

                            if (await GetAccountInfo(ct).ConfigureAwait(false))
                            {
                                Log(LogPrefix, "Refresh sucess.");
                                AuthTimer = DateTime.Now;
                                break;
                            }
                            await Task.Delay(1000, ct).ConfigureAwait(false);
                        }
                        if (retry_auth > 0)
                        {
                            continue;
                        }
                        Log(LogPrefix, "Refresh failed.");
                        break;
                    }
                    else
                    {
                        break;
                    }
                }
                catch (WebException ex)
                {
                    Log(LogPrefix, ex.ToString());
                    Log(LogPrefix, ex.Status.ToString());
                    var waitsec = rnd.Next((int)Math.Pow(2, Math.Min(retry - 1, 8)));
                    Log(LogPrefix, "wait " + waitsec.ToString() + " sec");
                    await Task.Delay(waitsec * 1000).ConfigureAwait(false);
                }
                catch (OperationCanceledException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    error_str = ex.ToString();
                    Log(LogPrefix, error_str);
                    break;
                }
            }
            throw new SystemException(LogPrefix + " Failed. " + error_str);
        }