Тайм-аут Полли внутри задачи - PullRequest
0 голосов
/ 08 января 2020

Я вызываю конечную точку, которую я хочу повторить, если она возвращает 404 или немедленно завершается с ошибкой при других исключениях.

Работает нормально для более коротких промежутков времени, но когда я работаю с экспоненциальным откатом, я вижу «Попытка планирования» 10/11 in at [date] ", но никакие последующие вызовы не выполняются.

Я хочу запустить это в задаче, потому что я хочу удалить его из основного потока и обработать в фоновом режиме. Может ли проблема быть связана с решением задачи?

var settingsPage = _contentQueries.GetComponent<SettingsPage>();
var retryCount = 11;
var token = _authorizationService.GetBearerToken();

Task.Factory.StartNew(currentContext => {
    HttpContext.Current = (HttpContext) currentContext;

    var captureResult = Policy.HandleResult<HttpResponse>(r => r.Status == (int)HttpStatusCode.NotFound).WaitAndRetry(retryCount, retryAttempt =>
    {
        var nextAttemptInSeconds = Math.Pow(3, retryAttempt);
        _logger.Log($"Scheduling retry attempt {retryAttempt}/{retryCount} at {DateTime.Now.AddSeconds(nextAttemptInSeconds)}", activity, Level.Debug);
        return TimeSpan.FromSeconds(nextAttemptInSeconds);
    }).ExecuteAndCapture(() =>
    {
        var result = MakeWebClientGetRequest();

        if (RemoteErrorOccurred(result))
        {
            throw new Exception(result.Response);
        }

        return result;
    });


    if (captureResult.Outcome == OutcomeType.Successful)
    {
        _logger.Log("Process successful", activity, Level.Debug);
    }
    else
    {
        if (captureResult.FinalException != null)
        {
            _logger.Log($"Failed to process: {captureResult.FinalException}", activity, Level.Debug);
        }
        else
        {
            _logger.Log($"Failed to process after {retryCount} attempts", activity, Level.Debug);
        }
    }

    _databaseFactory.Dispose();
}, HttpContext.Current);
private static bool RemoteErrorOccurred(HttpResponse result)
{
    return result.Exception != null && result.Status != (int) HttpStatusCode.NotFound;
}

1 Ответ

1 голос
/ 09 января 2020

В итоге я использовал Hangfire's BackgroundJob.Enqueue в пользу Task.Factory.StartNew. Повторное использование пула приложений предотвращает такие длительные задачи, как в моем вопросе.

...