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); }
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); }