Я изучаю библиотеку Полли, и я уже знал, что есть 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;
}