Я пишу лазурную функцию, которая синхронизирует данные каждые 15 минут. Я ориентируюсь на .net 3.1 для функции Azure и использую httpclient для отправки запроса на получение в их API.
var response = await client.GetStringAsync()
Обычно получение результатов занимает около 20 секунд, однако иногда их сервер обрабатывает запрос некорректно или просто занят, и это занимает слишком много времени или не возвращает никаких данных. Я проверил в почтальоне, и я получаю статус Ok 200, но он продолжает загружаться в течение многих минут, и ничего не происходит. Однако, если вы просто отмените операцию и повторите попытку, все будет нормально.
Теперь мой вопрос: как я могу отслеживать время, необходимое для получения результата от моего метода get client.GetStringAsync()
, и как-то отменить операцию, если, скажем, она длиннее 2 минут?
Вы подумали о тайм-ауте Полли?
Если вы используете .NET 5, вы можете использовать CancellationTokenSource с функцией «отменить после» и передать токен в client.GetStringAsync(), например:
var cts = new CancellationTokenSource()
cts.CancelAfter(120000); // Cancel after 2 minutes
try
{
var response = await client.GetStringAsync(uri, cts.Token);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nTask cancelled due to timeout.\n");
}
Затем вы можете обернуть операцию в блок try-catch, чтобы увидеть, была ли операция отменена токеном.
Ссылка: Отмена асинхронных задач через некоторое время (C#)
ОБНОВЛЯТЬ
В .NET Core вы можете указать время ожидания для вашего HttpClient. Однако обратите внимание, что этот тайм-аут применяется ко всем запросам, которые вы отправляете с использованием этого экземпляра HttpClient. Если вы хотите сделать это таким образом, вы можете сделать следующее:
client.Timeout = TimeSpan.FromMinutes(2);
try
{
var response = await client.GetStringAsync(uri);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nRequest cancelled due to timeout.\n");
}
Спасибо за отзыв. Я получаю здесь ошибку компилятора, заявляя, что перегрузка для GetStringAsync не принимает 2 аргумента. Похоже, я не могу передать токен отмены этому методу.
@GencHani, извини. Первый вариант, который я перечислил выше, доступен только в .NET 5. Но вы можете использовать тайм-аут HttpClient в .NET Core.
Спасибо @Франк Фахардо. Идем со вторым подходом!
@GencHani У CancellationTokenSource
есть конструктор, где вы можете указать тайм-аут. Обратите внимание на настройку клиента Timeout
. Это глобальный тайм-аут, который применяется для каждого запроса.
@PeterCsala спасибо за комментарий. Что ж, поскольку я использую лазурную функцию, и в моем случае она будет срабатывать каждые 15 минут и будет выполнять только одно задание (каждый раз вызывать одну и ту же конечную точку), я думаю, это не будет проблемой.
См. верхний ответ: stackoverflow.com/questions/34292089/…