Прямо сейчас вы используете Optimistic
тайм-аут, который ожидает, что delgate, который вы вызываете, уважает и отвечает на токен отмены. Ваш делегат этого не делает, в этом случае вам нужно использовать Pessimistic
тайм-аут, чтобы гарантировать, что вызывающий абонент не ждет, когда прошло указанное время ожидания.
static async Task timeoutPolicy()
{
var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(1, TimeoutStrategy.Pessimistic); // setup the timeout limit to be 1 sec
HttpResponseMessage response = await timeoutPolicy.ExecuteAsync((ct) => LongOperation(), CancellationToken.None);
}
Время ожидания Полли , как указано в документе Optimistic
- значение по умолчанию.
Как уже заметил @moutain путешественник, оптимистичный тайм-аут требует, чтобы вы прошли и сотрудничали с отменой тайм-аута. Это уже обрабатывается вызовами API с использованием HttpClient
, но в этом примере ваш код будет выглядеть примерно так:
static async Task timeoutPolicy()
{
var timeoutPolicy = Policy.TimeoutAsync<HttpResponseMessage>(1, TimeoutStrategy.Optimistic); // setup the timeout limit to be 1 sec
HttpResponseMessage response = await timeoutPolicy.ExecuteAsync((ct) => LongOperation(ct), CancellationToken.None);
}
static Task<HttpResponseMessage> LongOperation(CancellationToken token)
{
return Task<HttpResponseMessage>.Factory.StartNew(() =>
{
var longTask = Task.Delay(5000);
while (!longTask.IsCompleted)
{
token.ThrowIfCancellationRequested();
}
return new HttpResponseMessage()
{
StatusCode = HttpStatusCode.BadRequest
};
});
}