Почему Optimistic timeoutPolicy автоматически создает исключение TimeoutRejectedException, если в нем содержится retryPolicy? - PullRequest
0 голосов
/ 29 апреля 2019

Я изучаю библиотеку Полли, и я уже знал, что есть 2 TimeoutStrategy: TimeoutStrategy.Optimistic & TimeoutStrategy.Pessimistic.

Я говорю о TimeoutStrategy.Optimistic здесь.В этом случае ожидается, что исполняемый делегат обязан соблюдать токен отмены и вызывать cancellationToken.ThrowIfCancellationRequest () для принудительного применения timeoutPolicy.

Однако в следующем коде я не добавляю никакой cancellationToken.ThrowIfCancellationRequest () вручную в выполняемой задаче LongOp делегата (CancellationToken ct), в то время как по-прежнему сохраняется исключение TimeoutRejectedException.Как это случилось?

    static async Task Main(string[] args)
    {
        AsyncTimeoutPolicy<int> timeoutPolicy = Policy.TimeoutAsync<int>(TimeSpan.FromSeconds(2), TimeoutStrategy.Optimistic);
        AsyncRetryPolicy<int> waitAndRetryPolicy = Policy<int>.HandleResult(r => r == 11) // make it always retry
                                                                .WaitAndRetryForeverAsync(retryAttempt => TimeSpan.FromMilliseconds(10));

        var policyWrap = Policy.WrapAsync(timeoutPolicy, waitAndRetryPolicy);

        int result;
        try
        {
            result = await policyWrap.ExecuteAsync(async ct => await LongOp(ct), CancellationToken.None);
        }
        catch(TimeoutRejectedException)
        {
            Console.WriteLine("timeout");
        }

        Console.WriteLine("hello world");
        Console.ReadLine();
    }

    static async Task<int> LongOp(CancellationToken ct)
    {

        Console.WriteLine("hi");

        return 11;
    }
...